最初の説明は、2 番目の正しい説明です。最初の正しい説明は非常に似ています。「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
どちらの場合も、が before に書かれているか after に書かれているかは未定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
ます。