gpt4 book ai didi

c++ - 成员初始化中表达式的求值是否相对于彼此排序?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:12 24 4
gpt4 key购买 nike

具体来说,假设我有:

struct X { X(int i) { cout << i; } };
int f() { cout << 'f'; return 0; }
int g() { cout << 'g'; return 1; }

struct Z {
Z() : a(f()), b(g()) {}
X a, b;
};

int main() { Z z; cout << '\n'; }

我知道成员的构造函数保证按照它们在 struct 中定义的顺序被调用,所以 0 将在 1 之前打印。但是如何评价他们的论点呢?是否保证:

f0g1

?或者,也许,

fg01

gf01

也是有效输出吗?

对标准的引用表示赞赏。

最佳答案

C++11 draft standard 中,每个成员初始值设定项都是一个完整表达式,因此所有副作用都必须在下一个评估之前生效。

12.6.2 初始化基和成员7 说:

[...]The initialization performed by each mem-initializer constitutes a full-expression. Any expression in a mem-initializer is evaluated as part of the full-expression that performs the initialization.[...]

1.9 程序执行14 说:

Every value computation and side effect associated with a full-expression is sequenced before every value computation and side effect associated with the next full-expression to be evaluated.

12.6.2部分的相关语法如下:

ctor-initializer:
: mem-initializer-list
mem-initializer-list:
mem-initializer ...opt
mem-initializer , mem-initializer-list ...opt
[...]

Pre C++11 在每个作为完整表达式的 mem-initializer 上没有相同的措辞,至少在可用的最古老的标准草案 1804 中没有。但据我所知,我在 Are multiple mutations of the same variable within initializer lists undefined behavior pre C++11 中使用的相同逻辑也适用于这种情况,因此我们应该期望在 C++11 之前也有相同的行为。

关于c++ - 成员初始化中表达式的求值是否相对于彼此排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22329703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com