Почему std :: pair не конструктивен? - PullRequest
0 голосов
/ 11 июня 2018

Следующий код:

#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, а почему это не ход ходовой?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Обычно конструкторы по умолчанию определяются как noexcept, когда это возможно.Однако std::pair имеет конструктор по умолчанию, определенный без noexcept (т.е. не nothrow).Вы можете проверить это сами здесь .

Вы можете видеть, что конструктор по умолчанию для std::pair определен без noexcept (первый элемент из ссылки), и переместите конструктор для std::pairпо умолчанию (8-й элемент из ссылки).

Поскольку вы не объявили / не определили никакого конструктора для Foo, его конструкторы являются значениями по умолчанию, поэтому noexcept.

0 голосов
/ 12 июня 2018

Интересно, что ни один из конструкторов не объявлен как исключение при любых условиях .Вероятно, типичный стандартный дефект (только текстовое описание ниже обещает не создавать исключений, если ни один из элементов не делает.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...