在C中允许重复的const限定符但在C ++中不允许?

时间:2011-04-25 17:42:41

标签: c++ c language-agnostic const

示例代码段

const const const int x = 10;   
int main()
{}

在C中编译,但在C ++中编译。为什么用C编译?我认为这也会在C中失败。没关系。

C ++标准的哪一部分禁止使用重复的const以及C标准的哪一部分允许这样做?

4 个答案:

答案 0 :(得分:23)

C99§6.7.3/ 4:

  

如果相同的限定符在同一个说明符 - 限定符列表中出现多次,或者直接或通过一个或多个 typedef ,则行为与如果它只出现一次。

是的,这是有效的C99,您的发现是正确的。

答案 1 :(得分:16)

从上一个C ++ 0x草案中,[dcl.type]:

  

作为一般规则,在声明的完整decl-specifier-seq或类型说明符-seq或trailing-type-specifier-seq中最多允许一个类型说明符。此规则的唯一例外如下:

     

- const可以与除自身之外的任何类型说明符组合使用。

     

- volatile可以与除自身之外的任何类型说明符组合使用。

     

- signed或unsigned可以与char,long,short或int结合使用。

     

- 短或长可与int结合使用。

     

- long可以与double结合使用。

     

- long可以与long结合使用。

答案 2 :(得分:4)

C ++ 0x语法似乎允许它:

  

CV-限定符-SEQ

     
      
  • cv-qualifier cv-qualifier-seq opt
  •   
     

CV-限定符

  const

  volatile

此外,[decl.type.cv]似乎允许:

  

有两个 cv-qualifiers constvolatile。如果 cl-qualifier 出现在 decl-specifier-seq 中,则声明的 init-declarator-list 不应为空。 [注意:3.9.3和8.3.5描述了cv-quali的影响   对象和函数类型。 - 尾注]多余的cv资格被忽略。 [注意:例如,这些   可以由typedef引入。 - 结束说明]

答案 3 :(得分:4)

C ++ 2003在7.1.5 / 1中禁止它...“除非通过使用typedef或模板类型参数引入,否则禁止使用冗余cv限定符......”。