C++ 将右值引用传递给类构造函数的意义是什么?

C++ 将右值引用传递给类构造函数的意义是什么?,c++,constructor,move-semantics,rvalue,C++,Constructor,Move Semantics,Rvalue,嗯 所以我有一门课,我的课。我想用int向量来构造这个类。我想把这个向量移到物体上。该类没有模板化 class Myclass { public: Myclass (std::vector<int> && in) : vec{in} {}; Myclass (std::vector<int> & in) : vec{in} {}; private: std::vector<int> vec

所以我有一门课,我的课。我想用int向量来构造这个类。我想把这个向量移到物体上。该类没有模板化

class Myclass {
     public:
     Myclass (std::vector<int> && in) : vec{in} {};
     Myclass (std::vector<int> & in) : vec{in} {};

    private:
    std::vector<int> vec;
    }
class-Myclass{
公众:
Myclass(std::vector&&in):vec{in};
Myclass(std::vector&in):vec{in};
私人:
std::vec;
}
大体上我有

std::vector<int> orig (100);
Myclass A {orig};
std::cout << A.size() << '\n';
std::矢量源(100);
Myclass A{orig};

关于引用,右值和左值,要记住的是它们是左值。这意味着,如果您有一个对某个对象的引用,那么该引用是一个左值,您需要
std::move
将其转换为右值,以便可以移动它

Myclass(std::vector&in)
Myclass(std::vector&in)
之间的真正区别在于,对于第一个

Myclass A {std::move(orig)};
// or
Myclass A {std::vector(100)};
并且不能将左值传递给它,就像第二个一样,你只能使用它

Myclass A {orig};
因为它不会让你传递一个右值给它


还要注意,构造函数3“不正确”。只有在有转发引用时,才应使用
std::forward
std::vector&&in
是一个右值引用,而不是转发引用,因此您应该使用
std::move
。要正确使用forward,您需要一个模板构造函数,如

template <typename T, std::enable_if_t<
                                       std::is_same<std::decay_t<T>, 
                                       std::vector<int>>, bool> = true>
Myclass (T&& in) : vec{std::forward<T>(in)} {}; 
template=true>
Myclass(T&&in):vec{std::forward(in)}{};

非常感谢您的回答。我只看到了带有模板的forward,这就是为什么我明确提到我的类没有模板化的原因……虽然它看起来“有效”,但可能没有。第二个例子是,动态生成向量并将其传递给构造函数是使用右值ref版本的一个很好的理由。我没想到!我一直在想,如果它没有实际“转发”右值引用,为什么它会有用。在这种情况下,@TCD它会“工作”,但这是更令人高兴的巧合。仅仅将类作为模板是不够的。如果您有
模板结构foo{foo(T&&);}
表示
foo(T&&)
不是转发引用,而是右值引用。只有当您具有类似于
/*template*/struct foo{template foo(T&&);}的内容时,才能获得转发引用Myclass(std::vector in):vec{std::move(in)}{}
构造函数中。调用方可以根据是否需要保留副本来决定是移动构造还是复制构造临时向量。
Myclass (std::vector<int> && in) : vec{std::forward<std::vector<int>(in)} {};    // (3)
Myclass A {std::move(orig)};
// or
Myclass A {std::vector(100)};
Myclass A {orig};
template <typename T, std::enable_if_t<
                                       std::is_same<std::decay_t<T>, 
                                       std::vector<int>>, bool> = true>
Myclass (T&& in) : vec{std::forward<T>(in)} {};