对于某种类型,有两个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
不同吗?
答案 0 :(得分:30)
在typedef情况下明确允许,并且在声明本身中不允许:
类型说明符是:
type-specifier :... cv-qualifier
定义类型说明符 :类型说明符
可以在声明中使用的说明符是:
decl-specifier :... define-type-specifier ...
每个decl-specifier最多只能出现一次 decl-specifier-seq,除了long可能出现两次。
有两个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)
要摆脱的最后一个更改是解决方案禁用
在 XML 中看起来像
...
<DisableSpecificWarnings>4114</DisableSpecificWarnings>
</ClCompile>
或行参数显示 /wd"4114"