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