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;