将右值引用传递给 class 构造函数有什么意义?
What is point of passing rvalue reference to class constructor?
好的
所以我有一个 class,MyClass。我想用整数向量构造这个 class 。我想将这个向量移动到对象中。 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)};
并且不能将左值传递给它,而与第二个一样,您只能使用
Myclass A {orig};
因为它不会让您将右值传递给它。
另请注意,构造函数 3 是 "incorrect"。当您有转发参考时,您应该只使用 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)} {};
好的
所以我有一个 class,MyClass。我想用整数向量构造这个 class 。我想将这个向量移动到对象中。 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)};
并且不能将左值传递给它,而与第二个一样,您只能使用
Myclass A {orig};
因为它不会让您将右值传递给它。
另请注意,构造函数 3 是 "incorrect"。当您有转发参考时,您应该只使用 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)} {};