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);
所有最近版本的g与-std = c 11接受c行但拒绝d行. C 11标准表示空指针常量是值为0的整数常量表达式. (这已经改为C 14).
clang(3.4.1及更高版本)拒绝-std = c 11模式中的c行.
所以看来g中有一个bug,但我想确认这个bug是在b还是d定义中.
最佳答案 据我所知,static_cast< int&&>(5)确实是一个常量表达式,其结果是来自草案C 11标准部分5.2.9 [expr.static.cast]的xvalue:
[…]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应用的,行为是有效的.