相关疑难解决方法(0)

函数参数评估和副作用

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)

c++ side-effects undefined-behavior language-lawyer c++17

18
推荐指数
1
解决办法
904
查看次数

在聚合的“std::initializer_list”初始化中省略嵌套大括号是否合法?

考虑以下代码:

run on gcc.godbolt.org

#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],但没有发现任何有趣的东西。

c++ initializer-list language-lawyer

6
推荐指数
0
解决办法
139
查看次数