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

标签 c++ constructor move-semantics rvalue



所以我有一个类,MyClass。我想用一个int vector 构造这个类。我想将此 vector 移到对象中。该类未模板化。

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

    private:
    std::vector<int> vec;
    }

我主要是
std::vector<int> orig (100);
Myclass A {orig};
std::cout << A.size() << '\n';

我希望将“orig”移为“A”后为空。在以上两个选项中都不会发生这种情况。
即使我这样做
    std::vector<int> orig (100);
    Myclass A {std::move(orig)};
    std::cout << A.size() << '\n';  // still prints 100

看来我可以通过实现
 Myclass (std::vector<int> && in) : vec{std::move(in)} {};   // (1)

要么
 Myclass (std::vector<int> & in) : vec{std::move(in)} {};    // (2)

要么
Myclass (std::vector<int> && in) : vec{std::forward<std::vector<int>(in)} {};    // (3)

我的问题是,为什么(1)看起来与(2)完全一样?

最佳答案

关于引用,右值和左值,要记住的是它们是左值。这意味着,如果您有对事物的引用,则该引用是一个左值,并且需要std::move将其转换为右值以便可以移动它。
Myclass (std::vector<int> && in)Myclass (std::vector<int> & in)之间的真正区别是您必须使用第一个

Myclass A {std::move(orig)};
// or
Myclass A {std::vector(100)};

并不能将左值传递给它,在第二种情况下,您只能使用
Myclass A {orig};

因为它不会让您传递右值。

另请注意,构造函数3是“不正确的”。只有具有转发引用时,才应使用std::forwardstd::vector<int> && in是一个右值引用,而不是转发引用,因此您应该改用std::move。要正确使用转发,您需要一个模板构造函数,例如
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)} {}; 

关于c++ - 将右值引用传递给类构造函数的意义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61488711/

相关文章:

c++ - 如何将 C++ 类返回到 NODE.JS

c++ - 为什么显式允许默认构造函数和具有 2 个或更多(非默认)参数的构造函数?

c++ - 从 char* move std::string 的构造函数

c++ - move 语义 == 自定义交换功能已过时?

c++ - 重用 QProcess 对象 (Qt 4.8)

c++ - 通过空格将字符串解析为 vector

c++ - MFC静态库和外部rc(resource)文件图标加载问题

c++ - 将构造函数声明为私有(private)会显示错误。至少有一个公共(public)构造函数是强制性的吗?

c++ - 如何正确编写指针函数声明?

c++ - 合并 unique_ptr 的两个 vector 时“使用已删除的函数”