[英]Doesn't compiler give an ambiguous error for “const” and “not-const” functions
[英]Why compiler doesn't give error when typedef const pointer is used with extra const?
以下給出了預期的錯誤:
int* const const p = new int; // g++ error: duplicate cv-qualifier
但是下面沒有給出任何錯誤,即使它相當於上面一個:
typedef int* const intp_const;
intp_const const p = new int; // ok !
// ^^^^^ duplicate ?
為什么編譯器會忽略額外的const
?
[注意: intp_const const
與const char* const
,因為*p = <value>;
有可能。]
在7.1.5 [dcl.type](C ++ 03)中,聲明通過typedef引入時允許冗余的cv限定符:
const或volatile可以與任何其他類型說明符組合使用。 但是,除非通過使用typedef(7.1.3)或模板類型參數(14.3)引入冗余cv限定符,否則將禁止冗余cv限定符,在這種情況下,將忽略冗余cv限定符。
7.1.6 p 2禁止在相同的decl-specifier-seq中使用多個const
作為一般規則,在聲明的完整decl-specifier-seq或類型說明符-seq或trailing-type-specifier-seq中最多允許一個類型說明符。 此規則的唯一例外情況如下:
- const可以與除自身之外的任何類型說明符組合使用。
7.1.6.1 p 1允許通過typedef使用:
有兩個cv限定符,const和volatile。 如果cv-qualifier出現在decl-specifier-seq中,則聲明的init-聲明符列表不應為空。 [注意:3.9.3和8.3.5描述了cv限定符如何影響對象和函數類型。 - 尾注] 多余的cv資格被忽略。 [注意:例如,這些可以由typedef引入。 - 結束說明]
至於允許使用typedef的原因 - 我想這是因為它是無害的,如果編譯器不允許它,那么解決它可能會很煩人。 你告訴編譯器你希望它是const,所以它就是這樣做的。 你有效地說了兩次是沒有必要挑剔的。
但是,在同一聲明中出現兩次的const沒有真正的目的,很容易避免,因此給出了診斷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.