g ++接受代码:
char b[static_cast<int&&>(5)];
N3936 [expr.const] / 3将术语定义为:
整数常量表达式是整数或未整数枚举类型的表达式,隐式转换为prvalue,其中转换后的表达式是核心常量表达式。 [注:这样的表达方式 可以用作数组边界[...]
我不确定,因为表达式看起来像int&&
类型,但3.9中整数类型的定义并未提及引用类型。< / p>
如果不清楚,我的问题是:static_cast<int&&>(5)
是一个整数常量表达式吗?
背景:问题的动机如下:
char *c = (1 - 1);
char *d = static_cast<int&&>(0);
g++
的所有最新版本-std=c++11
接受c
行,但拒绝d
行。 C ++ 11标准表示空指针常量是值为0
的整型常量表达式。 (这对于C ++ 14来说已经改变了。)
clang(3.4.1及更高版本)拒绝c
模式中的-std=c++11
行。
所以看来g ++中存在一个错误,但我想确认错误是否在b
或d
定义中。
答案 0 :(得分:2)
据我所知,static_cast<int&&>(5)
确实是一个常量表达式,其结果是来自草案C ++ 11标准部分5.2.9
[expr。]的 xvalue 。 static.cast]:
[...]如果T是右值 引用对象类型,结果是xvalue [...]
如果我们转到5.19
[expr.const]部分,我们有:
条件表达式是核心常量表达式,除非[...]
我们有以下子弹:
- 左值 - 右值转换(4.1),除非它适用于
有以下例外:
- 文字类型的glvalue,指的是一生中没有的非易失性临时对象 结束,用常量表达式初始化;
您还注意到:
clang(3.4.1及更高版本)错误地拒绝-std = c ++ 11模式中的c行。
但是作为T.C.注意,因为此更改是通过DR 903 clangs应用的,行为是有效的。