5

以下给出了预期的错误:

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

4

3 回答 3

12

在 7.1.5 [dcl.type] (C++03) 中,声明当通过 typedef 引入时允许冗余 cv 限定符:

const 或 volatile 可以与任何其他类型说明符结合使用。但是,除了通过使用 typedef (7.1.3) 或模板类型参数 (14.3) 引入时,禁止使用冗余 cv 限定符,在这种情况下忽略冗余 cv 限定符。

于 2012-07-18T04:20:37.253 回答
6

7.1.6 p 2 禁止const在同一个decl-specifier-seq中使用多个

作为一般规则,在声明的完整 decl-specifier-seq 或 type-specifier-seq 或 trailing-type-specifier-seq 中最多允许一个类型说明符。此规则的唯一例外情况如下:

— const 可以与除自身之外的任何类型说明符组合。

7.1.6.1 p 1 允许通过 typedef 使用:

有两个 cv 限定符,const 和 volatile。如果 cv-qualifier 出现在 decl-specifier-seq 中,则声明的 init-declarator-list 不应为空。[ 注意:3.9.3 和 8.3.5 描述了 cv 限定符如何影响对象和函数类型。— 尾注]冗余的 cv 限定被忽略。[ 注意:例如,这些可以由 typedefs 引入。——尾注]

于 2012-07-18T04:23:29.557 回答
0

至于使用 typedef 允许它背后的原因——我想这是因为它是无害的,如果编译器不允许它,解决它可能会很烦人。您已经告诉编译器您希望它是 const,所以它就这么做了。没有必要挑剔你已经有效地说了两次。

但是,在同一个声明中出现两次的 const 没有真正的目的,很容易避免,因此给出了诊断。

于 2012-07-18T04:23:52.283 回答