我正在阅读value categories,并且遇到了以下内容(为简洁起见省略了很多):
以下表达式是prvalue表达式:
- 文字(字符串文字除外),例如42,true或nullptr;
属性:
- 非类非数组prvalue不能通过cv限定。
但是......以下程序编译并运行正常on ideone.com和g ++ 5.4.0:
#include <iostream>
int main() {
std::cout << ((const int) 42) << std::endl;
}
我理解编译器提供扩展,并且如果未定义的行为被击中,它可以做各种事情。我只想弄清楚标准的要求。
在N4296中,我发现以下相关段落:
[EXPR]
[...内容省略...]
- 如果prvalue最初具有“cv T”类型,其中T是a cv-unqualified non-class,non-array type,表达式的类型 在进行任何进一步分析之前,将其调整为T.
醇>
“最初”这个词引起了我的兴趣。目前尚不清楚是否允许将其作为另一个表达式的结果,例如用户将非类非数组prvalue显式地转换为cv限定类型(产生另一个prvalue),或者这是否仅适用于“root” “表达式(在这种情况下为42
)。
我的问题是,标准是否允许这样的表达式(只是剥离了cv限定符),或者这是否被禁止(如果相关,这是强制要求的地方)?
答案 0 :(得分:2)
您应该意识到cppreference不是规范性的。 &#34;不能&#34;可以通过两种方式阅读:
这是禁止的,ala&#34;不得&#34;
根本不可能发生,ala不变量
您在文中列出的引文:
如果prvalue最初具有“cv T”类型,其中T是a cv-unqualified non-class,non-array type,表达式的类型 在进行任何进一步分析之前,将其调整为T.
告诉我,cv合格的prvalue会降低资格,就像数组可以衰减到指针一样(澄清一下,这个规则不会发生在演员阵容错误的地方)。缺陷#1261确实使语言非常明确地说明了在哪里发生的事情。
答案 1 :(得分:2)
感谢SanderDeDycker指出要搜索的标准的相关部分。
我的问题在N4296的以下部分回答(强调我的):
<强> [expr.cast] 强>
- 表达式(T)cast-expression的结果是T型。该 如果T是左值引用类型或右值,则结果是左值 如果T是右值引用,则引用函数类型和xvalue 对象类型;否则结果是一个prvalue。 [注意:如果T是 cv限定的非类型类型,cv限定符被丢弃 在确定所得到的prvalue的类型时;见第5条。 - 尾注]
醇>
因此我们可以得出结论,(const int) 42
之类的表达式是完全合法的C ++。