【发布时间】:2022-09-24 22:23:29
【问题描述】:
假设我有这样的函数声明:
static const int R = 0;
static const int I = 0;
void f(const int& r = R);
void g(int i = I);
根据 [dcl.fct.default]/1:
如果在参数声明中指定了初始化子句,则 初始化子句用作默认参数 [..]
并且根据语法结构,一个初始化器可以包括一个初始化子句.正确的?
所以我得出结论,
R是初始化器对于参数r,I也是初始化器对于参数i。现在根据 [const.expr]/2:
变量或临时对象
o是常量初始化的,如果
- (2.1) 要么它有初始化器[..] 和
- (2.2) 其初始化的完整表达式是一个常量表达式 [..]
所以这两个参数都有一个初始化器,而且它们初始化的完整表达式是一个常量表达式。
那么,是否考虑了
r和i两个参数常量初始化?
-
g()等价于g(I)等价于g(0)。 -
@Jarod42 - 你想说什么?
-
不知道你的问题是什么......函数参数永远不是
constexpr,并且存在上述等价性。
标签: c++ language-lawyer initializer default-arguments