第一个的描述是第二个的正确描述。第一个的正确描述非常相似,您只需要在其他之前添加“复制当前值m1”步骤。
但是,如果m1
具有原始类型,那么在这里确实缺少序列点。规则在C++ 03和C++ 11之间有所变化。
如果m1
有一个用户定义的类型,那么涉及影响排序的函数调用。
此代码
offSpring1[m1++] = temp1;
执行以下(如果m1
是基本类型):
auto const old_m1(m1);
auto const new_m1(old_m1 + 1);
auto& lhs(offSpring[old_m1]);
parallel { lhs = temp1; m1 = new_m1; }
此代码
offSpring1[++m1] = temp1;
正是不同之处在于同一lhs
绑定使用new_m1
而不是old_m1
。
无论哪种情况,在m1
之前或之后是否写入lhs
都未指定。
如果m1
不是原始类型,它看起来更像:
auto const& index = m1.operator++(0); // one argument
auto& lhs = offSpring.operator[](index);
lhs = temp1;
VS
auto const& index = m1.operator++(); // no arguments
auto& lhs = offSpring.operator[](index);
lhs = temp1;
在这两种情况下,改变m1
在写lhs
之前肯定做。
酷男!好例子。谢谢 – Guido 2012-02-15 17:24:48