函数参数默认实参是否为初始化器?对应参数是否属常量初始化?
函数参数默认实参与常量初始化的判定
示例代码
static const int R = 0; static const int I = 0; void f(const int& r = R); void g(int i = I);
默认实参是否属于参数的初始化器?
根据C++标准[dcl.fct.default]/1条款:
若参数声明中指定了initializer-clause,则该initializer-clause将被用作默认实参。
从语法结构来看,initializer(初始化器)的定义包含initializer-clause,因此可以明确:R是参数r的初始化器,I是参数i的初始化器。
常量初始化的判定规则
依据[const.expr]/2条款的定义:
变量或临时对象
o满足常量初始化的条件是:
- (2.1) 它拥有一个初始化器,且
- (2.2) 其初始化的完整表达式是常量表达式。
对两个参数的具体判定
参数
i(按值传递的int):
调用g()使用默认实参时,i由I初始化。I是常量表达式,初始化的完整表达式符合要求,因此i属于常量初始化。参数
r(const int&引用):
调用f()使用默认实参时,引用r绑定到已完成常量初始化的静态常量对象R。绑定操作的完整表达式属于常量表达式,且r拥有合法的初始化器R,满足常量初始化的全部条件。
综上,参数r和i都会被视为经过常量初始化的对象。
内容的提问来源于stack exchange,提问作者mada
相关产品推荐
相关产品推荐

