2014-10-03 46 views
3

談論一個函數參數,例如:第二個const在「const int const&someval」中做什麼?

void doSomething(const int const &someVal); 

據我瞭解,拳頭常量表示該值將不會被函數改變,並且&表示該值應該傳遞參考。但是第二個'const'是做什麼的?

+6

它刺激,混淆,並導致[編譯器診斷](http://ideone.com/ZYakRQ)。 – 2014-10-03 18:16:13

+3

使程序不合格嗎? – 0x499602D2 2014-10-03 18:16:15

+1

它握着蠟燭。 – jrok 2014-10-03 18:17:22

回答

2

根據C++標準(7.1.6.1的CV-限定符)

1有兩個cv修飾符,常量和揮發性。 每個cv限定符 在cvqualifier seq中應至多出現一次。如果cv限定符 出現在decl-specifier-seq中,則 聲明的init聲明符列表不應爲空。 [注意:3.9.3和8.3.5描述瞭如何使用 cv-qualifiers影響對象和函數類型。 - 注意] 冗餘cv資格被忽略。 [注:例如,這些可以通過typedefs.,注完介紹]

所以這個聲明

void doSomething(const int const &someVal); 

有被簡單地忽略冗餘const修飾。

如果someVal將被聲明爲對const指針的引用,則第二個const限定符將有意義。例如,

void doSomething(const int * const &someVal); 
+0

它不僅被忽略。 'const int const'由7.1.6 [dcl.type]/p2不合格,第一個要點:「'const'可以與任何類型說明符組合_except本身_」。 (強調增加)。 – 2014-10-03 21:16:30

0

這兩個應該工作:

void doSomething(const int &someVal); 

void doSomething(int const &someVal); 

使用第二常量不添加任何功能和額外的一個應該被刪除。儘管爲了清晰起見,將常量保留在左邊是一個很好的習慣,因爲它更好。

相關問題