[有效的现代C ++]说,
所以我做了一个实验
#include<iostream>
#include<vector>
using namespace std;
struct A{
A(){}
A(const A&){ cout << "copy ctor\n"; }
A(A&&){ cout << "move ctor\n"; }
};
int main()
{
vector<A> vi(2);
size_t c = 0;
cout<<"========\n";
for (size_t i = 0; i<4; ++i)
{
cout<<"push_back...........\n";
vi.push_back(A());
if (vi.capacity()>c)
{
c = vi.capacity();
cout << c << endl;
}
}
return 0;
}
GCC / clang运行它,push_back判断如果容量不够,所有元素都会被复制到新位置。如果我将移动ctor改为A(A&amp;&amp;)noexcept,那么它会调用移动ctor。 这与书中所说的完全相同
但我测试了VC2013 / 2015:无论我添加了什么&#34; noexcept&#34;它是否会调用&#34;移动ctor&#34;并且永远不会复制ctor&#34;。 这是VC的错误,还是VC有编译选项来保证异常安全,但默认情况下不打开?
感谢。