(int&&)5是一个整数常数表达式吗?

时间:2015-11-27 02:02:57

标签: c++ c++11 language-lawyer rvalue-reference

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 ++中存在一个错误,但我想确认错误是否在bd定义中。

1 个答案:

答案 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应用的,行为是有效的。