2013-02-03 105 views
10

以下代码在C++中是否合法?函数的一个未命名参数是否有默认值?

void f(void* = 0) 
{} 

int main() 
{ 
    f(); 
} 

C++标准的哪一页指出这种用法是合法的?

+0

然而,它是,我不能什么做作情况弄清楚这样的功能实际上可以有任何用处... –

+3

@MatteoItalia'enable_if'常用。 – Pubby

+0

@MatteoItalia:SFINAE –

回答

11

是的,这是合法的。

有没有标准的措辞,允许这种功能的具体组合;根本没有任何也不允许它。

默认参数语法适用于一个参数声明起作用参数:

[C++11: 8.3.6/1]:如果初始化子句参数声明初始化子句中指定是用作默认参数。缺省参数将用于尾随参数丢失的调用中。在一个参数声明

...和功能参数可以是未命名:

[C++11: 8.3.5/11]:[..]一种identi音响ER能够任选被提供作为参数名称。 [..]

甚至有一个下8.3.6/4这种用法的例子(尽管示例不是标准化文本,所以这不能被用于具体地证明什么)。

11

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

[实施例:报关

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

声明了一个可以与零个,一个或两个参数来调用功能int类型。

+2

示例不是规范性的;) –

+0

@LightnessRacesinOrbit,我在看:)它不像它明确说“默认参数可以是未命名的”。我想它的基础是与非默认参数共享属性。 – chris

+0

好的,我得到了一个令人困惑的证据,但Light做得很好,所以不值得试图混淆后来的人:) – chris

1

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

-1

它不仅是合法的,它可能实际上是非常有用的,这取决于你的编码风格。

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

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

f。H:

void f(void*=nullptr); 

f.cc

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

_“命名参数只在函数定义中有意义。”_ lolwut ..我明白你想在这里说什么,但我觉得有点可笑。 –

相关问题