相同的const类型限定符

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
这段代码没问题,你具体有什么问题? - M.M
2个回答

31

在typedef的情况下允许,但在声明本身中则不允许:

[dcl.type/1]

  

类型说明符为:

  

type-specifier:... cv-qualifier
  defining-type-specifiertype-specifier

[dcl.spec/1 and 2]

  

可以用于声明的关键字是:

  

decl-specifier:... defining-type-specifier ...

  

在完整的decl-specifier-seq中,每个decl-specifier最多只能出现一次,除了long可以出现两次。

[dcl.type.cv/1]

  

有两种cv修饰符,const和volatile。 每个cv修饰符在cv-qualifier-seq中最多只能出现一次。如果cv-修饰符出现在decl-specifier-seq中,则声明的init-declarator-list或member-declarator-list不得为空。[注意:[basic.type.qualifier]和[dcl.fct]描述了cv修饰符如何影响对象和函数类型。 - end note] 冗余的cv限定被忽略。[注意:例如,这些可能由typedef引入。- end note]

除了类型别名,模板参数是另一种情况,其中限定符可能是多余的。允许这样做的原因是为了不打破本来正确的声明,只是因为cv限定符悄悄地溜进后门。


2
我印象深刻:你记住了标准?! - Bathsheba
@Bathsheba - 只有索引 :) 其他的都是非常模糊的回忆。 - StoryTeller - Unslander Monica
12
故事讲述者是一个哈希表:确认。 - Quentin
1
@gast128 - 这很难理解。但是通过实践,它会变得更容易,所以我鼓励你继续尝试。 - StoryTeller - Unslander Monica
1
@Quentin - 鉴于SO的政策,我这条评论非常不合适。但是当我读到你的评论时,我感觉你应该知道我差点把咖啡从鼻子里喷出来了。^_^ - StoryTeller - Unslander Monica
显示剩余3条评论

0

需要消除的最后一个问题是 解决方案 范围内的 禁用

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

在 XML 中看起来像这样

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

或者行参数显示 /wd"4114"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接