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>&&的虚拟函数的返回值传递给a不同类型的Stack<int> second_a?它是如何工作的?是否存在隐式转换?

它是如何工作的?

second_a是由返回值初始化的副本。

是否存在隐式转换?

是的。对非const的右值引用隐式地转换为对const的左值引用,const是复制构造函数的形参。

dummy是一个毫无意义的函数。只有std::move只能在Stack上调用。std::move本身也是一个返回右值引用的函数。下面的代码实际上是一样的:

Stack<int> second_a = std::move(first_a);

并且由于类模板没有move构造函数,因此它实际上与:

Stack<int> second_a = first_a;

最新更新