问题描述
int&& a = const_cast<int&&>(int{10});
int&& a = const_cast<int&&>(10);
第一次编译通过,第二次没有。为什么会发生这种情况?
在我看来,这是因为 10 是一个字面量,而 int{10} 是一个未命名的变量。是吗?
解决方法
您的第一次转换通过的唯一原因是 g++ 中的错误。两个代码都不合法,clang 和 icc 都拒绝它。
他们甚至传达了一个很好的信息:
错误:const_cast 到右值引用类型的操作数不能 成为非类纯右值
这是有道理的,因为 10
和 int{10}
都是 prvalues,并且您不能将引用直接绑定到纯右值。相反,当引用被初始化时,编译器 materializes the temporary variable 并绑定一个引用到它。但是,没有为 const_cast
实现临时变量的规则 - 所以没有什么可以绑定引用。