将在调整向量大小时调用对象的复制构造函数

Mis*_*tyD 5 c++ vector deque

假设我std::vector<foo>现在知道向量末尾的插入是摊销常数。这意味着它可以是 O(1) 或 O(n) (因为它获取一个新的内存块,将旧的内容复制到新的内存块中)。我的问题是,当将项目复制到较新的内存块(据说更大)时,是否会再次调用对象的复制构造函数?(第一次调用复制构造函数是使用push_back),在我的情况下,在调整向量大小时会再次调用 foo 的复制构造函数吗?我知道使用 std::deque 不会调用复制构造函数,因为它将对象的地址存储在堆上并将它们维护在向量类型数据结构中。C++98 和 C++11 中的行为是否相同

Jay*_*ler 6

在大多数情况下,是的,将调用复制构造函数。

从 C++11 开始,std::vector 将在重新分配时尝试移动对象。如果您的对象具有将调用的移动构造函数而不是复制构造函数。

感谢 Piotr,我现在知道它std::vector用于std::move_if_noexcept确定是否可以在不引发异常的情况下调用移动构造函数。有关详细信息,请参阅http://en.cppreference.com/w/cpp/utility/move_if_no except 。