在下面的C ++示例中:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
struct foo{
foo(int i) : s( to_string(i) ){ cout << "init foo : "+s+"\n"; }
foo(foo&& f) : s( move(f.s) ){ cout << "move foo : "+s+"\n"; }
foo(const foo& f) : s(f.s){ cout << "copy foo : "+s+"\n"; }
string s;
};
int main(){
vector<foo> f;
for(int i=0; i<5; i++){
cout << f.size() << endl;
f.push_back( foo(i) );
}
}
输出结果为:
0
init foo : 0
move foo : 0
1
init foo : 1
move foo : 1
copy foo : 0
2
init foo : 2
move foo : 2
copy foo : 0
copy foo : 1
3
init foo : 3
move foo : 3
4
init foo : 4
move foo : 4
copy foo : 0
copy foo : 1
copy foo : 2
copy foo : 3
每次更改std::vector
时,foo
似乎都会为容器中的所有capacity
元素调用复制构造函数。
有没有办法强制使用移动构造函数而不是复制构造函数?
我不知道vector
的最终尺寸,因此vector::reserve
不是可能的选择。
答案 0 :(得分:2)
你需要说明你的移动构造函数不会抛出
foo(foo&& f) noexcept : s(move(f.s)) { cout << "move foo : " + s + "\n"; }