一个未命名的函数参数可以有一个默认值吗?

时间:2013-02-03 18:41:14

标签: c++ function c++11 default-parameters function-signature

以下代码在C ++中是否合法?

void f(void* = 0)
{}

int main()
{
    f();
}

C ++标准的哪一页说明这种用法是合法的?

4 个答案:

答案 0 :(得分:12)

是的,这完全合法。一个明显的例子可以在N3485 8.3.6默认参数 / 4:

中找到
  

[例如:声明

void point(int = 3, int = 4);  
     

声明一个可以使用类型为int的零个,一个或两个参数调用的函数。

答案 1 :(得分:12)

是的,这是合法的。

没有标准的措辞可以特别允许这种功能组合;根本就没有禁止它。

默认参数语法适用于参数声明中的函数参数:

  

[C++11: 8.3.6/1]: 如果在参数声明中指定了 initializer-clause ,则使用 initializer-clause 作为默认参数。默认参数将用于缺少尾随参数的调用中。

... 参数声明中的函数参数可能未命名:

  

[C++11: 8.3.5/11]: [..] 标识符可以可选作为参数名称提供。 [..]

在8.3.6 / 4下甚至有一个这种用法的例子(虽然示例不是规范性文本,因此不能用于具体证明)。

答案 2 :(得分:1)

是的,这是合法的 为子句8.3.5 / 1中的函数参数提供的语法产生允许参数声明没有标识符,但带有赋值表达式(作为初始化)。

答案 3 :(得分:0)

不仅合法,而且根据您的编码风格,它实际上非常有用。

默认参数仅在函数声明中有意义。

命名参数仅在函数定义中有意义。

<强> f.h:

void f(void*=nullptr);

<强> f.cc

void f(void* x)
{
...
}