C++17では演算子のオペランドの評価順序が固定された。
以下の式は、a
, b
の順番に評価されることが規格上保証される。@=
の@
には文法上許される任意の演算子が入る(+=
, -=
など)。
a.b
a->b
a->*b
a(b1,b2,b3)
b = a
b @= a
a[b]
a << b
a >> b
つまり、
int* f() ;
int g() ;
int main()
{
f()[g()] ;
}
と書いた場合、関数f
がまず先に呼び出されて、次に関数g
が呼び出されることが保証される。
関数呼び出しの実引数のオペランドb1
, b2
, b3
の評価順序は未規定のままだ。
これにより、既存の未定義の動作となっていたコードの挙動が定まる。