Не должен ли 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 инициализирует оба элемента пары, первый и второй, поэтому он не может быть тривиальным.