2017-08-03 78 views
24

有兩個const的類型發出警告/錯誤。但是,如果類型已用typedef定義,則編譯器會接受它(包括Visual Studio 2013和聯機編譯器C++ shell)。相同的常量類型限定符

#include <iostream> 

typedef const int value_type; 

int main() 
{ 
    const value_type n = 0; //ok 
    const const int n2 = 0; //error C4114 

    return 0; 
} 

沒有人有一個想法,爲什麼?是不是const (const int),與const const int不同?

+1

此代碼是確定的,你準確的問題是什麼? –

回答

30

它明確允許的情況下的typedef,並禁止在聲明本身:

[dcl.type/1]

的類型說明符:

類型說明符:... cv-qualifier
定義類型說明符類型說明符

[dcl.spec/1 and 2]

可在聲明中使用的說明符:

DECL說明符:... 定義型-specifier ...

除了long可能出現兩次之外,每個decl指定符在一個完整的decl-specifier -seq中最多應出現一次。

[dcl.type.cv/1]

有兩個cv修飾符const和volatile。 每個cv-qualifier 應在cv-qualifier-seq中最多出現一次。如果cv限定符 出現在decl-specifier-seq中,則聲明的init-declarator-list或 成員聲明符列表不應爲空。 [注意: [basic.type.qualifier]和[dcl.fct]描述cv限定符如何影響 對象和函數類型。 - 結束註釋] 忽略冗餘cv資格 。 [注意:例如,這些可以通過 typedefs引入。 - 注完]

另外類型的別名,模板參數是另一種情況下可以修飾詞是多餘的。允許這樣做的基本原理是,不要因爲cv限定符偷偷溜進後門而破壞正確的聲明。

+2

我印象深刻:你記住了標準?! – Bathsheba

+0

@Bathsheba - 只有索引:)其他一切都是非常模糊的回憶。 – StoryTeller

+0

Thx似乎是這種情況。儘管如此,C++標準真的很難閱讀。 – gast128

相關問題