以下按预期出现错误:
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>;
是可能的。]
答案 0 :(得分:12)
在7.1.5 [dcl.type](C ++ 03)中,声明通过typedef引入时允许冗余的cv限定符:
const或volatile可以与任何其他类型说明符组合使用。然而,多余的cv- 除非通过使用typedef(7.1.3)或模板类型引入限定符,否则禁止使用限定符 参数(14.3),在这种情况下,冗余的cv限定符被忽略。
答案 1 :(得分:6)
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引入。 - 结束说明]
答案 2 :(得分:0)
至于允许使用typedef的原因 - 我想这是因为它是无害的,如果编译器不允许它,那么解决它可能会很烦人。你告诉编译器你希望它是const,所以它就是这样做的。你有效地说了两遍就没有必要挑剔。
然而,在同一声明中出现两次的const没有真正的目的,很容易避免,因此给出了诊断。