以下代码在C ++中是否合法?
void f(void* = 0)
{}
int main()
{
f();
}
C ++标准的哪一页说明这种用法是合法的?
答案 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)
{
...
}