c – (int \u0026\u0026)5是一个整数常量表达式吗?

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&&amp ;;但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应用的,行为是有效的.

点赞