假设T
是可移动的对象:
vector<T> v;
v.resize(...)
如果需要重新分配内存,那么代码会在所有元素上调用复制还是移动构造函数?
如果答案是“移动构造函数”,那么编译器如何知道它应该使用这个构造函数?
假设T
是可移动的对象:
vector<T> v;
v.resize(...)
如果需要重新分配内存,那么代码会在所有元素上调用复制还是移动构造函数?
如果答案是“移动构造函数”,那么编译器如何知道它应该使用这个构造函数?
#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::move_if_noexcept
更为可取。这需要一个noexcept移动构造函数,除非复制构造函数不可访问、已删除或无法使用。 - Howard Hinnantvector
和其他标准容器实际上使用的是move_if_noexcept
,它与移动构造函数是noexcept
相同,否则就是普通复制。 - John5342