14

以下代码在 C++ 中合法吗?

void f(void* = 0)
{}

int main()
{
    f();
}

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

4

4 回答 4

15

是的,这是完全合法的。在 N3485 8.3.6 Default Arguments /4 中有一个明显的例子:

[示例:声明

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

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

于 2013-02-03T18:46:34.433 回答
15

是的,这是合法的。

没有标准的措辞来专门允许这种功能组合;也没有任何禁止它的方法。

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

[C++11: 8.3.6/1]: 如果在参数声明中指定了初始化子句,则此初始化子句用作默认参数。默认参数将在缺少尾随参数的调用中使用。

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

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

在 8.3.6/4 下甚至还有一个这种用法的例子(虽然例子不是规范文本,所以这不能用来具体证明任何事情)。

于 2013-02-03T18:51:09.787 回答
1

是的,这是合法的。
第 8.3.5/1 节中为函数参数给出的语法产生式允许参数声明不带标识符,但带有赋值表达式(作为初始化器)。

于 2013-02-03T18:58:10.193 回答
0

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

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

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

fh:

void f(void*=nullptr);

fcc

void f(void* x)
{
...
}
于 2014-12-02T16:17:57.753 回答