为什么C++不允许函数参数用于默认值后面的参数?

Mic*_*ael 7 c++ language-lawyer default-parameters

这是对这个问题的后续跟进.OP问题中的代码看起来非常合理且对我来说毫不含糊.为什么C++不允许使用以前的参数来定义后面的参数的默认值,如下所示:

int foo( int a, int b = a );
Run Code Online (Sandbox Code Playgroud)

此外,至少在C++ 11中,声明的参数类型可用于确定返回类型,因此以类似的方式使用函数参数并非闻所未闻:

auto bar( int a ) -> decltype( a );
Run Code Online (Sandbox Code Playgroud)

因此,问题是:为什么foo不允许上述声明的原因是什么?

Bo *_*son 7

首先,这需要a在之前进行评估b,但C++(如C)没有定义函数参数的评估顺序.

您仍然可以通过添加重载来获得所需的效果:

int foo(int a, int b)
{ /* do something */ }

int foo(int a)
{ return foo(a, a); }
Run Code Online (Sandbox Code Playgroud)

  • 我不明白 C++ 没有指定评估顺序有什么关系。当使用此功能时,允许在以后的默认值中使用参数当然会强制执行一些偏序。但我不明白这会成为一个问题。我认为不被允许的原因只是收益太小了。 (2认同)