第一个的描述是第二个的正确描述。第一个的正确描述非常相似,您只需要在其他步骤之前添加一个“复制 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
。
无论哪种情况,都未指定lhs
是写入之前还是之后m1
。
如果m1
不是原始类型,它看起来更像:
auto const& index = m1.operator++(0); // one argument
auto& lhs = offSpring.operator[](index);
lhs = temp1;
对比
auto const& index = m1.operator++(); // no arguments
auto& lhs = offSpring.operator[](index);
lhs = temp1;
在这两种情况下,对的更改m1
肯定是在写入之前进行的lhs
。