我们可以将非类的prvalue强制转换为xvalue吗?

时间:2019-05-03 01:59:54

标签: c++ casting language-lawyer temporary const-cast

请参考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++-7clang-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

  • 此外,上面示例所源自的同一段内容是:

      

    对于两个类似的类型T1T2,类型T1的prvalue可以是   使用T2显式转换为类型const_cast。的结果   const_cast是指原始实体

    将此内容与它后面的内容进行比较(7.6.1.10,第4段[expr.const.cast]):

      

    对于两个T1T2对象类型,如果可以指向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 不会遭受临时物化转换,在我看来,这很奇怪。

然后,上面示例的目的是什么?

0 个答案:

没有答案