【问题标题】:Lvalue to rvalue conversion with integer pointer使用整数指针的左值到右值转换
【发布时间】:2018-04-20 08:44:45
【问题描述】:

如果我正确阅读implicit conversions

左值到右值的转换

任何非函数、非数组类型 T 的泛左值都可以隐式转换为相同类型的纯右值。 [..]

除非在未计算的上下文中遇到(在 sizeof、typeid、noexcept 或 decltype 的操作数中),此转换使用原始的 glvalue 作为构造函数参数有效地复制构造一个 T 类型的临时对象,并且该临时对象对象作为纯右值返回。

那为什么不行呢?

int* iptr = nullptr;
int*&& irr = iptr; // Cannot bind lvalue to rvalue reference

int* 类型应该已经通过临时隐式转换为相同类型的纯右值 - 因此绑定到右值引用没有问题。

【问题讨论】:

    标签: c++ language-lawyer rvalue-reference lvalue lvalue-to-rvalue


    【解决方案1】:

    标准明确指出这是格式错误的;不会(不应该)考虑左值到右值的转换。

    来自[dcl.init.ref]/5.4.4

    如果引用是右值引用,则初始化表达式不应是左值。

    [ 示例:

    double d2 = 1.0;
    double&& rrd2 = d2;                 // error: initializer is lvalue of related type
    

    【讨论】:

    • 我有点讨厌 C++ 的这类事情:异常和极端情况。
    • @Dean 嗯,基本思路很清楚了;即不能将左值绑定到右值引用。所以最好不要考虑太多,包括为什么不在引用绑定中应用左值到右值的转换;它们也有点极端。 :)
    猜你喜欢
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    相关资源
    最近更新 更多