【问题标题】:Why compiler doesn't give error when typedef const pointer is used with extra const?为什么当 typedef const 指针与额外的 const 一起使用时编译器不会出错?
【发布时间】:2012-07-18 04:03:28
【问题描述】:

以下给出了预期的错误:

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

【问题讨论】:

  • "为什么编译器会忽略多余的 const ?" 为什么不呢?
  • @curiousguy,因为没有typedef,额外的const 不会被忽略(第一行)。
  • 所以问题是:“为什么额外的const 是第一行的错误?”

标签: c++ pointers constants language-lawyer


【解决方案1】:

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

const 或 volatile 可以与任何其他类型说明符组合。然而,多余的简历- 禁止使用限定符,除非通过使用 typedefs (7.1.3) 或模板类型引入 参数 (14.3),在这种情况下,多余的 cv 限定符将被忽略。

【讨论】:

    【解决方案2】:

    7.1.6 p 2 禁止在同一个decl-specifier-seq

    中使用多个const

    作为一般规则,在声明的完整 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 限定符如何影响对象和函数类型。 — end note ] 冗余的 cv 限定被忽略。 [ 注意:例如,这些可以由 typedefs 引入。 ——尾注]

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-12
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 2021-12-31
        相关资源
        最近更新 更多