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.0和clang 3.5.1都拒绝编译你的代码,并且都提供合理的诊断.
| 归档时间: |
|
| 查看次数: |
293 次 |
| 最近记录: |