Не должен ли std:: pair <T1, T2> иметь тривиальный конструктор по умолчанию, если существуют T1 и T2?

У меня возникла проблема, потому что

 std::is_trivially_default_constructible<std::pair<T1,T2>>::value == false;

даже если

 std::is_trivially_default_constructible<T1>::value == true;
 std::is_trivially_default_constructible<T2>::value == true;

Мне не удалось найти вескую причину для этого дизайна. Не было бы целесообразно, чтобы std::pair<T1,T2> имел конструктор =default, если T1 и T2 имеют?

Простая работа (проще, чем определение моего pair<>)?

Ответы

Ответ 1

Простая причина: история! Оригинальный std::pair<T0, T1> не мог иметь тривиальный конструктор по умолчанию, поскольку у него был другой конструктор. Он был определен для инициализации своих членов. Изменение этого поведения в std::pair<T0, T1> для тривиально конструктивных типов, где люди полагаются на инициализацию значения, будет изменением.

В дополнение к причине истории конструктор по умолчанию std::pair<...> определяется как конструктор constexpr. Конструктор по умолчанию constexpr не может быть установлен по умолчанию.

Я не знаю об этом, кроме создания пользовательского класса.

Ответ 2

Конструктор по умолчанию для значения std:: pair инициализирует оба элемента пары, первый и второй, поэтому он не может быть тривиальным.