当typedef const指针与额外的const一起使用时,为什么编译器不会出错?

时间:2012-07-18 04:03:28

标签: c++ pointers const language-lawyer

以下按预期出现错误:

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>;是可能的。]

3 个答案:

答案 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没有真正的目的,很容易避免,因此给出了诊断。