You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数参数默认实参是否为初始化器?对应参数是否属常量初始化?

函数参数默认实参与常量初始化的判定

示例代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:35:15