2017-08-03 9 views
24

タイプに2つのconstがあると、警告/エラーが発行されます。ただし、型がtypedefで定義されている場合、コンパイラはそれを受け入れます(Visual Studio 2013とオンラインコンパイラC++シェルの両方)。同じconst型修飾子

#include <iostream> 

typedef const int value_type; 

int main() 
{ 
    const value_type n = 0; //ok 
    const const int n2 = 0; //error C4114 

    return 0; 
} 

誰にも理由はありますか?それはconst (const int)で、それはconst const intとは異なりますか?

+1

このコードは問題ありません。あなたの質問は正確ですか? –

答えて

30

それが明示的に宣言自体にtypedefのケースで許可され、禁止です:[dcl.type/1]

型指定子は、次のとおりです。

タイプ指定子:... cv-qualifier
defined-type-specifier型指定子

[dcl.spec/1 and 2]

宣言に使用することができる指定子は、次のとおり

赤緯指定子 ... 定義型 - 指定子 ...

各decl-specifierは、 のdecl-specifier-seqに最大で1回出現しますが、longが2回出現する場合があります。

[dcl.type.cv/1]

2 CV-修飾子constおよび揮発性があります。 各cv-qualifier は、多くてもcv-qualifier-seqに1回しか出現しません。 decl-specifier-seqにcv-qualifier がある場合、宣言のinit-declarator-listまたは member-declarator-listは空であってはなりません。 [注: [basic.type.qualifier]と[dcl.fct]は、cv修飾子がオブジェクト型と関数型の に与える影響を記述しています。 - end note] 冗長CV資格 は無視されます。 [注:たとえば、これらは、 typedefsによって導入される可能性があります。 - 終了ノート]

タイプエイリアスの他に、テンプレートパラメータは、修飾子が重複する可能性がある別のケースです。これを可能にする根拠は、バックドアにcv-qualifier snuckがあるからといって正しい宣言を破らないことです。

+2

私は感銘を受けました:あなたは標準を覚えましたか? – Bathsheba

+0

@Bathsheba - インデックスのみ:)他のすべては非常にあいまいな想い出です。 – StoryTeller

+0

Thxがそうであるようです。しかし、C++標準は自分で読むのが難しいです。 – gast128