右值引用是临时对象吗?为什么不进行以下编译?我认为这个函数返回了一个右值引用
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;
}
我读了移动语义文档,但我仍然不明白为什么上面没有绑定到右值引用
答案 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;
}