C++ 通过右值引用返回
template<typename T>
class Stack {
private:
std::vector<T> elems;
public:
Stack () = default;
Stack (T const& elem)
: elems({elem}) {}
};
template<typename T>
Stack<T>&& dummy(Stack<T>&& a){
return std::move(a);
}
int main(){
Stack<int> first_a = 10;
Stack<int> second_a = dummy(std::move(first_a));
...
}
该dummy函数具有正确的值引用返回类型Stack<T>&&。但是second_a有一个Stack<int>类型。我的问题如下:
- 如何将具有类型的虚拟函数的返回值
Stack<T>&&传递给不同的类型Stack<int> second_a?它是如何工作的?是否存在隐式转换?
回答
second_a 从返回值复制初始化。
是的。对非常量的右值引用被隐式转换为对作为复制构造函数参数的 const 的左值引用。
dummy是相当无意义的功能。只是std::move只能在 a 上调用Stack。std::move本身也是一个返回右值引用的函数。以下内容实际上是相同的:
Stack<int> second_a = std::move(first_a);
由于类模板没有移动构造函数,它实际上与以下内容相同:
Stack<int> second_a = first_a;