代码之家  ›  专栏  ›  技术社区  ›  Prasoon Saurav

R值与临时值

c++
  •  1
  • Prasoon Saurav  · 技术社区  · 14 年前

    rvalues ". 我说“不”,然后给他举了下面的例子

     double k=3;
    
     double& foo()
     {
        return k;
     }
    
     int main()
     {
    
         foo()=3; //foo() creates a temporary which is an lvalue
     }
    

    我的解释正确吗?

    3 回复  |  直到 14 年前
        1
  •  9
  •   fredoverflow    14 年前

    临时值和右值是不同(但相关)的概念。临时性是一个人的特性 对象 . 非临时对象的例子有局部对象、全局对象和动态创建的对象。

    表达

    rvalue是一个表达式,它的求值创建了一个临时对象,该对象在包含rvalue的完整表达式的末尾被销毁。

    注意,左值也可以表示临时对象!

    void blah(const std::string& s);
    
    blah(std::string("test"));
    

    在函数blah中,左值 s 表示通过计算表达式创建的临时对象 std::string("test") .

    这个 表达 function() 如果函数返回引用,则为左值。

        2
  •  7
  •   Community CDub    4 年前

    不,您返回的是对全局双精度的引用,而不是临时引用。

    对于真正的临时工,同样的测试是:

    double foo() { return 3.0; }
    int main() {
       foo() = 2.0; // error: lvalue required as left operand of assignment
    }
    

    答案只是为了证明这个例子是错误的,我并不想深入讨论临时值是否是右值。。。正如其他人所说,左值或右值是表达式的属性,而不是对象的属性(在最一般的意义上,不仅仅是类实例)。同样,标准规定:

    §3.10/5调用不返回引用的函数的结果是r值。用户定义的运算符是函数,这些运算符是否期望或产生左值取决于它们的参数和返回类型。

    §3.10/6保存从强制转换到非引用类型的临时对象的表达式是rvalue(这包括使用函数表示法显式创建对象(5.2.3))。

    这就是临时工产生的环境。现在,您还可以将常量引用绑定到临时对象,在这种情况下,您将获得一个新变量(引用),该变量可用作有效引用临时对象的左值。

        3
  •  0
  •   mip    14 年前

    移动语义 . 就像这个愚蠢的片段

    void blah(ICanBeTemporary && temp)
    {
        temp.data = 2; //here temporary becomes lvalue
    }
    
    
    //somewhere
    blah(ICanBeTemporary("yes I can"));
    

    现在我们有麻烦了。人们过去称之为临时值,这叫做 右值引用