函数定义中的四倍"const"

Fil*_*inx 3 c++ const language-lawyer

我想知道C++如何使用它的const关键字.

我有以下功能定义.单独看起来很疯狂,但工作得很好.

const int const * const Get(){ return new int(1); } const
Run Code Online (Sandbox Code Playgroud)

我知道const的每个位置意味着什么,这个问题不是关于const关键字的位置的意义.

我对使用const关键字感到困惑,因为你可以复制它们.

const int const const * const Get(){ return new int(1); } const

// or even

const const int const const * const const Get(){ return new int(1); } const const

// or even yet

const const const int const const const * const const const Get(){ return new int(1); } const const const
Run Code Online (Sandbox Code Playgroud)

为什么语言允许你这样做?

编辑:此代码可以在Visual Studio 2013,Visual C++编译器中编译.我不确定编译器的实际名称.

编辑2:所以答案是这是违反标准的.该代码仅使用/Za选项编译.

我投票结束这个问题.

Tar*_*ama 10

const标准中不允许在相同类型说明符序列中明确重复.

[dcl.type]/2(强调我的)

作为一般规则,在声明的完整decl-specifier-seq或类型说明符-seq或trailing-type-specifier-seq中最多允许一个类型说明符.

...

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

有人可能会认为这可以从以下引用中获得(由@davidhigh找到):

[dcl.type.cv]/1

有两个cv限定符,const和volatile.每个cv-qualifier在cv-qualifier-seq中最多只出现一次.如果cv-qualifier出现在decl-specifier-seq中,则声明的init-declarator-list不应为空.[注意:3.9.3和8.3.5描述了cv限定符如何影响对象和函数类型.- 尾注] 多余的cv资格被忽略.[注意:例如,这些可以由typedef引入. - 结束说明]

但是,此规则允许const通过模板或typedefs中的替换而产生的重复,而不是程序员明确键入的重复.

以你的一个例子为例:

const const int const const * const const Get(){ return new int(1); } const const
Run Code Online (Sandbox Code Playgroud)

前四个const都适用于int,打破了上面发布的规则.

接下来的两个consts适用于指针,并且由同一规则无效.

最后两个const甚至不是宣言的一部分Get.它们将应用于解析器下一步找到的任何内容,通过与上述相同的规则或其他C++语法规则变为无效.

VS2013可以使用语言扩展编译此类代码,但这不是标准行为.gcc 5.1.0clang 3.5.1都拒绝编译你的代码,并且都提供合理的诊断.