为什么C++不允许参数成为默认参数?

xml*_*lmx 3 c++ standards language-design default-parameters c++11

void g(int n, decltype(n) = 0); // ok
void f(int n, int = n); // error : default argument references parameter 'n'

int main()
{
    f(1); // want it to be same as f(1, 1);
}
Run Code Online (Sandbox Code Playgroud)

为什么C++不允许参数成为默认参数?

理由是什么?

AnT*_*AnT 10

该限制的一个经常被引用的潜在理由如下:允许参数作为默认参数将需要对参数评估施加至少部分排序.必须首先评估在其他参数中用作默认参数的参数.

同时,C++继续坚持原始参数评估方法:参数以未指定的顺序进行评估.

同样的推理可以用来解释为什么不能在成员函数的默认参数中引用类成员:这会对隐藏参数的评估施加一些排序要求this.