预期在std :: vector的元素上移动,但在尝试将其作为参数传递时会遇到复制

时间:2016-10-26 14:09:31

标签: c++11 move-semantics

为什么以下代码调用a的复制构造函数?

class a {
public:
    a(int x) : x_(x) { std::cout << "a constructor" << std::endl; }
    a(a&& a_) { std::cout << "a move constructor" << std::endl; }
    a(const a& a_) { std::cout << "a copy constructor" << std::endl; }

private:
    int x_;
};

class b {
public:
    b(std::vector<a>&& v) : v_(std::move(v)) {}

private:
    std::vector<a> v_;
};

int main() {
    b s({2, 3, 4, 5, 6});
}

输出如下:

a constructor
a constructor
a constructor
a constructor
a constructor
a copy constructor
a copy constructor
a copy constructor
a copy constructor
a copy constructor

我期待没有副本,因为矢量是在适当的位置创建的,并作为右值引用传递,然后移动。实际发生了什么?

1 个答案:

答案 0 :(得分:3)

$events = [ [ 'categoryId' => 1, 'eventId' => 2, 'eventName' => 3, 'vendorName' => 4 ], [ 'categoryId' => 5, 'eventId' => 6, 'eventName' => 7, 'vendorName' => 8 ], [ 'categoryId' => 9, 'eventId' => 10, 'eventName' => 11, 'vendorName' => 12 ], ]; print_r(array_column($events, 'categoryId')); std::initializer_list<T>个对象数组的包装器。 (更准确地说,std::initializer_list<T>::referenceconst T)。请注意const T&。它必须是这样的,因为它的元素可以是文字。

这意味着const的{​​{1}}构造函数必须列表中的元素复制到向量中,它无法移动它们。