C++20 标准在Function Call 7.6.1.3/8 中说:
参数的初始化(包括每个关联的值计算和副作用)相对于任何其他参数的初始化是不确定的。
不确定排序(与未排序相反)可确保影响同一内存区域的副作用不是未定义的行为。Cppreference给出了以下示例:
f(i = -2, i = -2); // C++17 之前未定义的行为 f(++i, ++i); // C++17 之前未定义的行为, C++17 之后未指定
C++17 中的变化似乎并未出现在引用的部分中,尽管其措辞在几个世纪以来基本上保持不变。(好的;在 n3337 中这只是一个注释。)
一个简单的示例会引发来自 gcc 和clang的警告:
void f(int fa, int fb);
void m() // contains code calling f()
{
int a = 11;
f(++a, ++a);
cout << "after f(): a=" << a << '\n';
}
Run Code Online (Sandbox Code Playgroud)
<source>:6:7: warning: multiple unsequenced modifications to 'a' [-Wunsequenced]
f(++a, ++a); …Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
#include <initializer_list>
struct A
{
int x;
};
int main()
{
std::initializer_list<A>{100};
}
Run Code Online (Sandbox Code Playgroud)
铿锵接受了。GCC 和 MSVC 拒绝它,并出现如下错误:
#include <initializer_list>
struct A
{
int x;
};
int main()
{
std::initializer_list<A>{100};
}
Run Code Online (Sandbox Code Playgroud)
这里哪个编译器是正确的?
我尝试查看[dcl.init.list]/5和[over.match.list],但没有发现任何有趣的东西。