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> 类型。我的问题如下:

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;