Wil*_*lli 0 c++ value-categories
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));
...
}
Run Code Online (Sandbox Code Playgroud)
该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);
Run Code Online (Sandbox Code Playgroud)
由于类模板没有移动构造函数,它实际上与以下内容相同:
Stack<int> second_a = first_a;
Run Code Online (Sandbox Code Playgroud)