是成员初始化中表达式的求值,它们相对于彼此排序
Are evaluations of expressions in member initialization sequenced with respect to each other?
具体来说,我有:
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标准草案中,每个成员初始化式都是一个全表达式,因此所有的副作用必须在下一个副作用被计算之前生效。
12.6.2
初始化基和成员段7说:
[…每个mem初始化器执行的初始化构成一个完整表达式。任何mem初始化式中的表达式作为执行初始化的全表达式的一部分进行计算。[…]
和1.9
程序执行第14段说:
在计算与下一个完整表达式相关的每个值计算和副作用之前,对与完整表达式相关的每个值计算和副作用进行排序。
12.6.2
部分的相关语法如下:
ctor-initializer:
: mem-initializer-list
mem-initializer-list:
mem-initializer ...opt
mem-initializer , mem-initializer-list ...opt
[...]
Pre c++ 11对于每个mem-初始化器都没有相同的措辞,是一个完整的表达式,至少在1804年可用的最老的标准草案中没有。但是,据我所知,我在Are中使用的逻辑相同,在初始化器中对同一变量进行多次突变,列出了c++ 11之前的未定义行为,在这种情况下也适用,因此我们应该期望相同的行为 c++ 11以及
根据c++标准
每个mem初始化器执行的初始化构成一个求值。mem初始化式中的任何表达式都计算为执行初始化
的全表达式的一部分
首先会执行完整表达式a(f()),然后执行完整表达式b(g())。
因为结果输出必须是
f0g1
相关文章:
- 为什么字符串比较的 == 运算符相对于任一字符串长度线性时间(似乎)?
- MOVNTI 存储是否相对于由同一线程创建的其他 MOVNTI 存储重新排序?
- 我如何知道字符串中字符相对于英文字母的位置值?
- 非静态成员引用必须相对于特定对象
- 如何在相对于观看方向的地形中移动
- CRTP相对于抽象类的优势
- 互斥锁能否保护相对于特定指针的数据?
- 在Visual Studio Code(.json配置)中设置相对于工作区路径的c / c ++项目的包含路径
- 是 C++ gcc HEAD 10.0.0 20190 相对于好友函数的错误吗?
- 相对于继承的构造函数,gcc 编译器是否还有一个错误?
- DirectX矩阵:相对于面向方向的转换(例如在FPS中)
- stat() 相对于文件系统是原子的
- 如何在3D世界中获得对象相对于父母的绝对位置
- 类相对于数据结构的重要性
- 在 C/C++ 中乘以低数字(相对于高数字)是否更快?
- 在 C++ 中,映射相对于堆的优势是什么?
- 相对于另一个向量对一个向量进行排序 - 最有效的方法
- 如何对一个向量相对于另一个向量进行排序
- std::atomic是否阻止非原子变量相对于原子变量的重新排序
- 是成员初始化中表达式的求值,它们相对于彼此排序