相同的const类型限定符

时间:2017-08-03 07:51:04

标签: c++ const typedef

对于某种类型,有两个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不同吗?

2 个答案:

答案 0 :(得分:30)

在typedef情况下明确允许,并且在声明本身中不允许:

[dcl.type/1]

  

类型说明符是:

     

type-specifier :... cv-qualifier
   定义类型说明符 类型说明符

[dcl.spec/1 and 2]

  

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

     

decl-specifier :... define-type-specifier ...

     

每个decl-specifier最多只能出现一次   decl-specifier-seq,除了long可能出现两次。

[dcl.type.cv/1]

  

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

除了类型别名之外,模板参数是限定符可能是多余的另一种情况。允许这样做的理由是,不要因为cv-qualifier在后门偷偷摸摸而破坏其他正确的声明。

答案 1 :(得分:0)

要摆脱的最后一个更改是解决方案禁用

  • C/C++
    • 高级
      • 禁用特定警告4114

在 XML 中看起来像

...
    <DisableSpecificWarnings>4114</DisableSpecificWarnings>
</ClCompile>

或行参数显示 /wd"4114"