2013-02-03 177 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 ..我明白你想在這裏說什麼,但我覺得有點可笑。 –

相關問題