一个可移动元素的向量会高效地调整大小吗?

4

假设T是可移动的对象:

vector<T> v;
v.resize(...) 

如果需要重新分配内存,那么代码会在所有元素上调用复制还是移动构造函数?

如果答案是“移动构造函数”,那么编译器如何知道它应该使用这个构造函数?


相关链接:https://dev59.com/LWsz5IYBdhLWcg3wR1zC - Vaughn Cato
1个回答

6
#include <vector>
#include<memory>

int main() {

    std::vector<std::unique_ptr<int>> v;

    for(int i = 0; i < 1000; ++i) {
        v.push_back(std::unique_ptr<int>(new int));
    }
}

此代码若使用拷贝构造函数,则将无法编译。
如果答案是“移动构造函数”,那么编译器如何知道它应该使用这个?
std::vector可以使用std::move。
如果它使用std::move,但没有移动构造函数,则等同于只使用拷贝构造函数。请参考链接:http://ideone.com/dyF6JI

1
为了满足强异常安全要求,使用std::move_if_noexcept更为可取。这需要一个noexcept移动构造函数,除非复制构造函数不可访问、已删除或无法使用。 - Howard Hinnant
如果我没记错的话,vector和其他标准容器实际上使用的是move_if_noexcept,它与移动构造函数是noexcept相同,否则就是普通复制。 - John5342
糟糕,被抢先了 :-P - John5342

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接