以下代码:
#include <iostream>
#include <iomanip>
#include <string>
#include <utility>
using namespace std;
struct Foo
{
std::string s;
int i;
};
int main()
{
cout << boolalpha << is_nothrow_constructible<Foo>::value << endl;
cout << is_nothrow_constructible<pair<string, int>>::value << endl;
cout << is_nothrow_move_constructible<Foo>::value << endl;
cout << is_nothrow_move_constructible<pair<string, int>>::value << endl;
return 0;
}
使用g++ -std=c++11
编译时生成以下输出:
true
false
true
true
std::pair<string, int>
为什么Foo
不是可以构造的,而WMIC
是,为什么它不可移动构造?
答案 0 :(得分:2)
有趣的是,none of the constructors is declared noexcept under any conditions。可能是典型的标准缺陷(只有下面的文本描述承诺如果没有任何元素,则不会抛出任何异常。)
答案 1 :(得分:0)
通常,默认构造函数尽可能定义为noexcept
。但是,std::pair
定义了默认构造函数,但没有noexcept
(即不是nothrow
)。您可以自己查看here。
您可以看到std::pair
的默认构造函数是在没有noexcept
的情况下定义的(链接中的第一项),并且std::pair
的移动构造函数是默认的(链接中的第8项)。
由于您尚未声明/定义Foo
的任何构造函数,因此其构造函数是默认值,因此noexcept
。