为什么std :: pair不能改变构造?

时间:2018-06-11 20:59:38

标签: c++ constructor move-semantics nothrow

以下代码:

#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是,为什么它不可移动构造?

2 个答案:

答案 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