将 std::move 与向量一起使用

Igo*_*gor 6 c++ move-semantics c++11

我有一个关于std::move在 C++ 中使用的问题。

假设我有以下类,它在其构造函数中采用 astd::vector作为参数:

class A
{
public:
    A(std::vector<char> v): v(v) {}
private:
    std::vector<char> v;
};
Run Code Online (Sandbox Code Playgroud)

但如果我在某处写下以下内容:

std::vector<char> v;
A a(v);
Run Code Online (Sandbox Code Playgroud)

的复制构造函数std::vector将被调用两次,对吧?那么我应该编写A如下所示的构造函数吗?

class A
{
public:
    A(std::vector<char> v): v(std::move(v)) {}
private:
    std::vector<char> v;
};
Run Code Online (Sandbox Code Playgroud)

如果我想调用以下内容怎么办?

std::vector<char> v;
A a(std::move(v));
Run Code Online (Sandbox Code Playgroud)

构造函数的第二个版本可以吗?或者我应该为此创建另一个构造A函数std::vector<char>&&

A.S*_*S.H 5

创建两个构造函数:第一个构造函数应该是 const&,第二个构造函数应该是 rvalue&&,这样它就可以使用移动语义:

class A
{
public:
    A(const std::vector<char>& v_) : v(v_) { std::cout << "const& ctor\n"; }
    A(std::vector<char>&& v_) : v(std::move(v_)) { std::cout << "rvalue&& ctor\n"; }
private:
    std::vector<char> v;
};
Run Code Online (Sandbox Code Playgroud)

测试:

int main()
{
    std::vector<char> v1{ 'a', 'b', 'c', 'd' };
    A a1(v1);
    A a2(std::vector<char>{ 1, 2, 3, 4 });
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

构造函数

右值&& 构造函数


Sto*_*ica 5

你的第二个方案很好。

第二个版本只会将向量移动两次(将按值参数移动到您的成员中)。如果您不介意额外移动的成本,您可以坚持将按值参数移动到您的成员中。

如果您介意,请为参数的不同值类别创建两个构造函数。