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 2constは、同じdecl-specifier-seqで複数を使用することを禁止します

原則として、宣言の完全なdecl-specifier-seq、またはtype-specifier-seqまたはtrailing-type-specifier-seqでは、最大で1つの型指定子が許可されます。この規則の唯一の例外は次のとおりです。

— constは、それ自体を除く任意の型指定子と組み合わせることができます。

7.1.6.1 p 1では、typedefを介して使用できます。

constとvolatileの2つのcv修飾子があります。cv-qualifierがdecl-specifier-seqに含まれている場合、宣言のinit-declarator-listは空であってはなりません。[注:3.9.3および8.3.5は、cv修飾子がオブジェクトおよび関数の型にどのように影響するかを説明しています。—エンドノート]冗長なcv-qualificationsは無視されます。[注:たとえば、これらはtypedefによって導入される可能性があります。—エンドノート]

于 2012-07-18T04:23:29.557 に答える
0

typedefで許可する理由については、これは無害であるためだと思います。コンパイラが許可しなかった場合、回避するのが面倒になる可能性があります。コンパイラにconstにするように指示したので、それを実行します。効果的に2回言​​ったので、うるさい必要はありません。

ただし、同じ宣言に2回出現するconstには実際の目的がなく、簡単に回避できるため、診断が行われます。

于 2012-07-18T04:23:52.283 に答える