繁体   English   中英

将右值引用传递给 class 构造函数有什么意义?

[英]What is point of passing rvalue reference to class constructor?

好的

所以我有一个 class,MyClass。 我想用整数向量构造这个 class 。 我想将此向量移动到 object 中。 class 没有模板化。

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)};

并且不能将左值传递给它,而与 second 一样,您只能使用

Myclass A {orig};

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


另请注意,构造函数 3 是“不正确的”。 只有在有转发引用时才应使用std::forward std::vector<int> && 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)} {}; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM