在我看来,当移动构造函数为 noexcept(false) 时,标准库必须调用复制构造函数而不是移动构造函数似乎是一致的。
现在我不明白为什么会这样。而且更多的 Visual Studio VC v140 和 gcc v 4.9.2 似乎以不同的方式做到了这一点。
我不明白为什么 noexcept 这是例如向量的问题。我的意思是如果 T 没有,vector::resize() 应该如何提供强大的异常保证。正如我所看到的,向量的异常级别将取决于 T。无论使用复制还是移动。我理解 noexcept 只是对编译器进行异常处理优化的一个眨眼。
这个小程序在使用 gcc 编译时调用复制构造函数,在使用 Visual Studio 编译时调用移动构造函数。
include <iostream>
#include <vector>
struct foo {
foo() {}
// foo( const foo & ) noexcept { std::cout << "copy\n"; }
// foo( foo && ) noexcept { std::cout << "move\n"; }
foo( const foo & ) { std::cout << "copy\n"; }
foo( foo && ) { std::cout << "move\n"; }
~foo() noexcept {}
};
int main() {
std::vector< foo > v;
for ( int i = 0; i < 3; ++i ) v.emplace_back();
}