gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:47 27 4
gpt4 key购买 nike

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 及更高版本)拒绝 c在线 -std=c++11模式。

看来 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

有以下异常(exception):

  • 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 行为是有效的。

关于c++ - (int&&)5 是整数常量表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33949332/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com