Почему 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
,