(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++11
的 g++
的最新版本接受 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 行为有效应用的。
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++11
的 g++
的最新版本接受 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 行为有效应用的。