C++花括号初始化是否会强制默认实参的求值顺序?
问题描述
假设存在类T,其构造函数定义如下:
T::T(int one, int two) {}
使用花括号初始化时,实参遵循从左到右的求值顺序,示例如下:
T t{ expression1, expression2 };
此时expression1一定会在expression2之前求值。但如果构造函数的第二个形参使用默认实参:
T::T(int one, int two = expression2) {} // ... T t{ expression1 };
这种情况下,原来的左到右求值顺序规则是否仍然适用?
回答
不适用。在C++标准中,函数调用时默认实参的求值是在所有显式传入的实参都完成求值之后,这和花括号初始化里显式实参的左到右求值规则是两个独立的逻辑。
具体到这个场景:
- 显式传入的
expression1会先被求值 - 之后才会对默认实参
expression2进行求值
这个顺序不是花括号初始化的左到右规则导致的,而是默认实参的求值时机本身就晚于所有显式实参。如果存在多个默认实参,它们之间的求值顺序是未指定的——比如构造函数定义为T::T(int one = expr1, int two = expr2) {},当调用T t{}时,expr1和expr2谁先求值没有统一规定,但显式实参(如果有的话)一定优先于所有默认实参完成求值。
内容的提问来源于stack exchange,提问作者Aleksandr Medvedev
相关产品推荐
相关产品推荐

