C++ return 通过右值引用
C++ return by rvalue reference
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
函数有一个正确的值引用 return 类型 Stack<T>&&
。但是 second_a
有一个 Stack<int>
类型。我的问题如下:
- 如何将类型为
Stack<T>&&
的虚拟函数的 return 值传递给一个
不同类型 Stack<int> second_a
?它是如何工作的?有没有隐式转换?
How does it work?
second_a
是从 return 值初始化的副本。
Is there a implicit conversion?
是的。对非 const 的右值引用隐式转换为对 const 的左值引用,即复制构造函数的参数。
dummy
是一个毫无意义的函数。只是 std::move
只能在 Stack
上调用。 std::move
本身也是一个函数,return 是一个右值引用。以下实际上是相同的:
Stack<int> second_a = std::move(first_a);
并且由于 class 模板没有移动构造函数,它实际上与:
Stack<int> second_a = first_a;
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
函数有一个正确的值引用 return 类型 Stack<T>&&
。但是 second_a
有一个 Stack<int>
类型。我的问题如下:
- 如何将类型为
Stack<T>&&
的虚拟函数的 return 值传递给一个 不同类型Stack<int> second_a
?它是如何工作的?有没有隐式转换?
How does it work?
second_a
是从 return 值初始化的副本。
Is there a implicit conversion?
是的。对非 const 的右值引用隐式转换为对 const 的左值引用,即复制构造函数的参数。
dummy
是一个毫无意义的函数。只是 std::move
只能在 Stack
上调用。 std::move
本身也是一个函数,return 是一个右值引用。以下实际上是相同的:
Stack<int> second_a = std::move(first_a);
并且由于 class 模板没有移动构造函数,它实际上与:
Stack<int> second_a = first_a;