std :: vector和移动可构造元素

时间:2017-02-18 16:41:16

标签: c++ c++11

根据文档,如果需要增加容量,则std::vector元素应为push_backemplace_back {/ 3}}。

但是在下面的示例中,即使类A具有移动构造函数,也会在调整大小时使用 copy 构造函数。如果我delete复制构造函数,则只使用移动构造函数。

#include <iostream>
#include <string>
#include <vector>

struct A
{
    A() { std::cout << "creating A\n"; }
    A(const A& that) { std::cout << "copying A\n"; }
    A(A&&that) { std::cout << "moving A\n"; }
};

int main()
{
    std::vector<A> vec;
    std::cout << "size=" << vec.size() << ", capacity=" << vec.capacity() << "\n";
    vec.emplace_back();
    std::cout << "size=" << vec.size() << ", capacity=" << vec.capacity() << "\n";
    for (size_t i = vec.size(), n = vec.capacity() + 1; i < n; i++) {
        vec.emplace_back();
    }
    std::cout << "size=" << vec.size() << ", capacity=" << vec.capacity() << "\n";
}

输出

size=0, capacity=0
creating A
size=1, capacity=1
creating A
copying A
size=2, capacity=2

问题是 - 不应该std::vector更喜欢我的移动构造函数而不是复制构造函数吗?

0 个答案:

没有答案