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

时间:2015-07-30 00:08:44

标签: c++ language-lawyer default-parameters

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

int foo( int a, int b = a );

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

auto bar( int a ) -> decltype( a );

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

1 个答案:

答案 0 :(得分:7)

首先,这需要在a之前评估b,但C ++(如C)不定义函数参数的评估顺序。

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

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

int foo(int a)
{ return foo(a, a); }