Почему std::pair не конструктивен?

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

#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 ответа

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

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

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

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

Другие вопросы по тегам