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

Why does C++ not allow a parameter to be a default argument?

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);
}

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

这是什么道理?

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

与此同时,C++ 继续坚持原来的参数求值方法:参数按 未指定 顺序求值。

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