C++ 通过右值引用返回

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?它是如何工作的?是否存在隐式转换?

eer*_*ika 5

它是如何工作的?

second_a 从返回值复制初始化。

是否存在隐式转换?

是的。对非常量的右值引用被隐式转换为对作为复制构造函数参数的 const 的左值引用。

dummy是相当无意义的功能。只是std::move只能在 a 上调​​用Stackstd::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)