大括号和括号之间的参数计算顺序
Argument evaluation order between curly braces and parentheses
#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 %dn", a._x, a._y, a._z);
return 0;
}
使用大括号或括号时,GCC 9.1
和MSVC 19.22.27905
都将打印不同的顺序。 对于这两种情况,Clang 8.0.0
将打印相同的订单。
我在标准中找不到有关它的任何内容,是在标准中还是由编译器对输入参数进行排序?
该顺序仅保证用于大括号的 init-list [dcl.init.list]/4:
(强调我的(
在大括号初始化列表的初始值设定项列表中,初始值设定项子句(包括由包扩展([temp.variadic](产生的任何子句(将按照其出现的顺序进行评估。也就是说,与给定初始值设定项子句关联的每个值计算和副作用在初始值设定项列表的逗号分隔列表中与它后面的任何初始值设定项子句关联的每个值计算和副作用之前进行排序。[注意:无论初始化的语义如何,此计算顺序都成立;例如,当初始值设定项列表的元素被解释为构造函数调用的参数时,它适用,即使通常调用的参数没有排序约束。
另一方面,函数调用中参数的计算顺序未指定。
未指定的行为- 程序的行为因实现而异,并且不需要符合实现来记录每个行为的效果。例如,计算顺序、相同的字符串文本是否不同、数组分配开销量等。每个未指定的行为都会导致一组有效结果之一。
似乎 Clang 评估了此声明中的参数
A a( func(), func(), func() );
从左到右。而其他编译器则按从右到左的顺序评估它们。
参数的计算顺序未指定。
至于大括号,则严格从左到右确定评估,并对每个表达式的评估进行排序。
相关文章:
- 计算 I+V[i++] 的顺序是什么?
- 委派的 ctor 是否受参数计算顺序的影响?
- 函数参数计算顺序与 Lambda 捕获评估顺序
- 构造函数中初始化列表的计算顺序是否固定?
- 大括号和括号之间的参数计算顺序
- C++:cout 和函数调用之间的计算顺序
- 操作员 * 的计算顺序
- C++:计算顺序运算符时忽略括号
- C ,以下代码的计算顺序
- 使用参数和此关键字时的计算顺序
- 为什么在 c++ 中未指定函数参数的计算顺序
- 构造函数中成员启动列表的计算顺序
- C++嵌套的条件运算符计算顺序
- 赋值子表达式的计算顺序
- 初始化中的计算顺序
- 宏计算顺序
- C语言中等优先级操作数的计算顺序
- 移动语义和参数计算顺序
- 运算符优先级和计算顺序
- C++ 参数计算顺序