C ++如何避免模糊移动构造函数

时间:2016-05-23 22:30:57

标签: c++11 constructor move-semantics

我的课程包含几个字段,assignment c-tormove c-tor

class A{
    std::vector<int> numbers;
    int k;


public:

    A(std::vector<int> &&numbers, const int k):
        numbers(numbers), // fast
        k(k)
    {
        // logic
    }

    A(const std::vector<int> &numbers, const int k):
        A(std::move(std::vector<int>(numbers)), k) // copy-and-move vector
    {
        // empty
    }
};

我希望将logic保留在一个c-tor中并从其他人那里调用它。 另外,我想支持快速move-semantics。我必须在copy-and-move中明确assignment c-tor个参数。

有没有办法避免这种嵌套构造并保留上面列出的所有优势?

1 个答案:

答案 0 :(得分:2)

您可以将一个构造函数委托给另一个:

struct A
{
    A(const std::vector<int> & v) : A(std::vector<int>(v)) {}

    A(std::vector<int> && v)
    : v_(std::move(v))
    {
        // logic
    }

    // ...
};

现在移动构造函数尽可能快,并且复制构造函数比将两个构造函数拼出时要多花费一倍。但是,如果您愿意支付额外费用,那么您可能只需要一个构造函数:

struct A
{
    A(std::vector<int> v)
    : v_(std::move(v))
    {
        // logic
    }
};

另一种方法是将公共代码放入一个函数中并从两个构造函数中调用它。