2017-08-03 112 views
24

有两个const的类型发出警告/错误。但是,如果类型已用typedef定义,则编译器会接受它(包括Visual Studio 2013和联机编译器C++ shell)。相同的常量类型限定符

#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
定义类型说明符类型说明符

[dcl.spec/1 and 2]

可在声明中使用的说明符:

DECL说明符:... 定义型-specifier ...

除了long可能出现两次之外,每个decl指定符在一个完整的decl-specifier -seq中最多应出现一次。

[dcl.type.cv/1]

有两个cv修饰符const和volatile。 每个cv-qualifier 应在cv-qualifier-seq中最多出现一次。如果cv限定符 出现在decl-specifier-seq中,则声明的init-declarator-list或 成员声明符列表不应为空。 [注意: [basic.type.qualifier]和[dcl.fct]描述cv限定符如何影响 对象和函数类型。 - 结束注释] 忽略冗余cv资格 。 [注意:例如,这些可以通过 typedefs引入。 - 注完]

另外类型的别名,模板参数是另一种情况下可以修饰词是多余的。允许这样做的基本原理是,不要因为cv限定符偷偷溜进后门而破坏正确的声明。

+2

我印象深刻:你记住了标准?! – Bathsheba

+0

@Bathsheba - 只有索引:)其他一切都是非常模糊的回忆。 – StoryTeller

+0

Thx似乎是这种情况。尽管如此,C++标准真的很难阅读。 – gast128

相关问题