第一個的描述是第二個的正確描述。第一個的正確描述非常相似,您只需要在其他之前添加「複製當前值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