hid*_*yat 4 c++ constructor language-lawyer c++11 c++17
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
uint32_t func() { return rand() % 10; }
struct A {
uint32_t _x, _y, _z;
A(uint32_t x, uint32_t y, uint32_t z) : _x(x), _y(y), _z(z) {}
};
int main() {
A a{func(), func(), func()};
//A a(func(), func(), func());
printf("%d %d %d\n", a._x, a._y, a._z);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
GCC 9.1并且MSVC 19.22.27905在使用大括号或括号时都将打印不同的顺序。
Clang 8.0.0两种情况下将打印相同的顺序。
我在标准中找不到任何内容,是在标准中找到还是由编译器命令它评估输入参数?
仅对braced -init-list [dcl.init.list] / 4保证顺序:
(强调我的)
在带有括号的初始列表的初始列表中,初始子句(包括由数据包扩展([temp.variadic])引起的子句)按照它们出现的顺序进行评估。即,在给定的初始化列表中以逗号分隔的列表中,与给定的初始化子条款相关的每个值计算和副作用在与跟随其后的任何初始化子条款相关的每个值计算和副作用之前进行排序。[注意:无论初始化的语义如何,此评估顺序都将保留;例如,当通常将初始化器列表的元素解释为构造函数调用的参数时,即使在调用的参数上通常没有排序约束,它也适用。—尾注]
在另一方面,在函数调用的参数计算顺序是不确定。
未指定的行为 -程序的行为在实现之间会有所不同,并且不需要一致性实现来记录每种行为的影响。例如,求值顺序,相同的字符串文字是否不同,数组分配开销的量等。每个未指定的行为都将导致一组有效结果中的一个。
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |