int{10}和10之间有什么区别?
作为标题,我有两个表达:
int&& a = const_cast<int&&>(int{10});
int&& a = const_cast<int&&>(10);
第一次编译通过,但第二次没有。为什么会这样?
在我看来,这是因为 10 是一个文字,而 int{10} 是一个未命名的变量。是吗?
回答
第一次转换通过的唯一原因是 g++ 中的错误。这两个代码都不合法,clang 和 icc 都拒绝它。
他们甚至发出了一个好消息:
错误:const_cast 到右值引用类型的操作数不能是非类纯右值
这是有道理的,因为10和int{10}都是纯右值,并且您不能将引用直接绑定到纯右值。相反,当引用被初始化时,编译器会具体化临时变量并将引用绑定到它。但是,没有用于实现临时变量的规则const_cast- 所以没有什么可以绑定引用。