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

Is (int&&)5 an integral constant expression?

g++ 接受代码:

char b[static_cast<int&&>(5)];

N3936 [expr.const]/3 将术语定义为:

An integral constant expression is an expression of integral or unscoped enumeration type, implicitly converted to a prvalue, where the converted expression is a core constant expression. [Note: Such expressions may be used as array bounds [...]

我不确定,因为表达式看起来有 int&& 类型,但 3.9 中 整数类型 的定义没有提及任何引用类型。

如果不清楚,我的问题是:static_cast<int&&>(5)是整型常量表达式吗?


背景:提问的动机如下:

char *c = (1 - 1);
char *d = static_cast<int&&>(0);

所有带有 -std=c++11g++ 的最新版本接受 c 行但拒绝 d 行。 C++11 标准表示空指针常量是一个 整数常量表达式,其值为 0 。 (这已针对 C++14 进行了更改)。

clang(3.4.1 及更高版本)在 -std=c++11 模式下拒绝 c 行。

看来 g++ 中有错误,但我想确认错误是在 b 还是 d 定义中。

据我所知,static_cast<int&&>(5) 确实是一个常量表达式,其结果是 C++11 标准部分草案中的 xvalue 5.2.9 [expr.static.cast]:

[...]if T is an rvalue reference to object type, the result is an xvalue[...]

然后如果我们转到第 5.19 [expr.const] 部分,我们有:

A conditional-expression is a core constant expression unless[...]

我们有以下要点:

  • an lvalue-to-rvalue conversion (4.1) unless it is applied to

但有以下例外:

  • a glvalue of literal type that refers to a non-volatile temporary object whose lifetime has not ended, initialized with a constant expression;

您还注意到:

clang (3.4.1 and later) incorrectly rejects the c line in -std=c++11 mode.

但作为T.C。注意,因为此更改是通过 DR 903 clangs 行为有效应用的。