簡體   English   中英

當typedef const指針與額外的const一起使用時,為什么編譯器不會出錯?

[英]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 constconst 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM