【发布时间】:2020-04-28 19:46:14
【问题描述】:
好的
所以我有一个班级,MyClass。我想用一个整数向量来构造这个类。我想将此向量移动到对象中。该类未模板化。
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) 完全一样?
【问题讨论】:
-
请注意,您可以将两个构造函数统一为一个
Myclass(std::vector<int> in) : vec{std::move(in)} { }构造函数。调用者可以根据是否需要保留副本来决定是移动构造还是复制构造临时向量。
标签: c++ constructor move-semantics rvalue