5

以下代码:

#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>nothrow 不可构造,whileFoo是,为什么它是 nothrow move 可构造的?

4

2 回答 2

3

有趣的是,在任何条件下都没有声明构造函数 noexcept。可能是一个典型的标准缺陷(只有下面的文字描述承诺在没有任何元素的情况下不会抛出任何异常。)

于 2018-06-11T21:09:51.073 回答
0

通常,noexcept尽可能定义默认构造函数。但是,std::pair没有定义默认构造函数noexcept(即 not nothrow)。你可以在这里自己检查。

您可以看到默认构造函数的std::pair定义没有noexcept(链接中的第一项),并且移动构造函数的std::pair默认值(链接中的第 8 项)。

由于您没有为 声明/定义任何构造Foo函数,因此它的构造函数是默认值,因此noexcept.

于 2018-06-11T21:15:45.463 回答