请参考7.6.1.10第3段[expr.const.cast](N4810)中的示例:
typedef int *A[3]; // array of 3 pointer to int
typedef const int *const CA[3]; // array of 3 const pointer to const int
...
A &&r2 = const_cast<A&&>(CA{}); // OK
所以,标准说是合法代码,但是
g++-7
或clang-6
中的任何一个都不能编译。
实际上,llvm
中的this const_cast
-related comments指出:
....
if (isa<RValueReferenceType>(DestTypeTmp) && SrcExpr.get()->isRValue()) {
if (!SrcType->isRecordType()) {
// Cannot const_cast non-class prvalue to rvalue reference type. But if
// this is C-style, static_cast can do this.
msg = diag::err_bad_cxx_cast_rvalue;
return TC_NotApplicable;
}
// Materialize the class prvalue so that the const_cast can bind a
// reference to it.
NeedToMaterializeTemporary = true;
}
...
这基本上表明我们不能物化(= cast)非类 prvalue 到 xvalue 。
此外,上面示例所源自的同一段内容是:
对于两个类似的类型
T1
和T2
,类型T1
的prvalue可以是 使用T2
显式转换为类型const_cast
。的结果const_cast
是指原始实体。
将此内容与它后面的内容进行比较(7.6.1.10,第4段[expr.const.cast]):
对于两个
T1
和T2
对象类型,如果可以指向T1
的指针 使用以下命令显式转换为“指向T2
的指针”类型const_cast
,那么还可以进行以下转换:可以使用强制转换
T1
将类型T2
的- 左值显式转换为类型
const_cast<T2&>
的左值; / li> 可以使用强制转换T1
将类型T2
的- glvalue 显式转换为类型
const_cast<T2&&>
的 xvalue 。 和- 如果
T1
是类类型,则类型T1
的 prvalue 可以显式转换为 xvalue T2的类型>使用强制转换const_cast<T2&&>
。如果操作数是glvalue,则引用const_cast的结果将引用原始对象;否则,将引用到应用临时实现转换的结果。
这种对比似乎暗示,从非类 prvalue 转换为 xvalue 不会遭受临时物化转换,在我看来,这很奇怪。
然后,上面示例的目的是什么?