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) ); } }

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) ); } },c++,c++11,vector,constructor,stl,C++,C++11,Vector,Constructor,Stl,似乎std::vector每次更改其容量时都会调用容器中所有foo元素的复制构造函数 有没有办法强制使用move构造函数而不是copy构造函数 我不知道向量的最终大小,因此向量::reserve不是一个可能的选择。您需要声明您的移动构造函数不会抛出 foo(foo&& f) noexcept : s(move(f.s)) { cout << "move foo : " + s + "\n"; } foo(foo&&f)noexcept:s(move(f.s)){不

似乎
std::vector
每次更改其
容量时都会调用容器中所有
foo
元素的复制构造函数

有没有办法强制使用move构造函数而不是copy构造函数


我不知道
向量的最终大小,因此
向量::reserve
不是一个可能的选择。

您需要声明您的移动构造函数不会抛出

foo(foo&& f) noexcept  : s(move(f.s)) { cout << "move foo : " + s + "\n"; }

foo(foo&&f)noexcept:s(move(f.s)){不能将move操作符和构造函数声明为noexcept?请不要回答,让我们像傻瓜一样关闭。@NathanOliver抱歉,我知道答案,甚至没有费心搜索。
foo(foo&& f) noexcept  : s(move(f.s)) { cout << "move foo : " + s + "\n"; }