我正在阅读value categories,并遇到以下内容(为简洁起见,省略了很多):
以下表达式是纯右值表达式:
- 文字(字符串文字除外),例如 42、true 或 nullptr;
特性:
- 非类非数组纯右值不能是 cv 限定的。
但是......以下程序在 ideone.com和 g++ 5.4.0 上编译并运行良好:
#include <iostream>
int main() {
std::cout << ((const int) 42) << std::endl;
}
我知道编译器提供了扩展,如果遇到未定义的行为,它们可以做各种各样的事情。我只是想弄清楚标准的要求。
在N4296中,我发现以下相关段落:
[表达式]
[...内容省略...]
- 如果纯右值最初具有类型“cv T”,其中 T 是无 cv 限定的非类、非数组类型,则表达式的类型会在任何进一步分析之前调整为 T。
“最初”这个词让我很震惊。目前尚不清楚这是否允许作为另一个表达式的结果,例如用户将非类非数组纯右值显式转换为 cv 限定类型(产生另一个纯右值),或者这是否仅适用于“根" 表达式(42
在这种情况下)。
我的问题是,标准是否允许这样的表达式(它只是去掉了 cv 限定符),还是不允许这样做(如果相关,这在哪里是强制性的)?