返回临时,为什么不是左值参考?

时间:2015-05-11 17:50:02

标签: c++

右值引用是临时对象吗?为什么不进行以下编译?我认为这个函数返回了一个右值引用

main.cpp:40:12: error: no viable conversion from 'hello3 ()' to 'hello4'
    hello4 lol = returning;

代码

#include <iostream>
#include <string>
#include <vector>

class hello {
  public:  
};


class hello2 {
  public:  
};

class hello3 {
  public:  
  hello obj1;
  hello2 obj2;

};


class hello4 {
 public:

 hello4(hello3&&) {
  std::cout << "he";   
 }

};

hello3 returning() {
    hello a;
    hello2 b;
    return {a,b};

}

int main()
{
    hello4 lol = returning;
}

我读了移动语义文档,但我仍然不明白为什么上面没有绑定到右值引用

2 个答案:

答案 0 :(得分:5)

  

右值参考是临时对象吗?

不,它是对可能或可能不是临时对象的引用。

  

为什么不进行以下编译?

因为您将(空)参数列表从函数调用中删除:

hello4 lol = returning();
                      ^^

错误消息表明您的代码尝试将函数(而不是调用函数的结果)分配给变量。

  

我认为这个函数返回了一个右值引用

不,它返回一个对象,因为没有任何参考引用的对象。但是该临时对象可以绑定到 rvalue 引用,因此可以用它来构造hello4

答案 1 :(得分:1)

上面的编译器错误与对象的值类型无关:

hello4 lol = returning;

应该是

hello4 lol = returning();

如果没有括号,编译器会认为您正在尝试将函数分配给hello4值。你可以在这里看到:

int main()
{
    auto lol = returning;
    hello4 foo = lol();

    return 0;
}