Ответ 1
Да, эта гарантия верна. Цитирование стандарта С++ 11, §20.3.2/2-3:
constexpr pair();
2 Требуется:
is_default_constructible<first_type>::value
-true
, аis_default_constructible<second_type>::value
-true
.
3 Эффекты: значения инициализируютсяfirst
иsecond
.
И §8.5/7:
Для инициализации объекта с типом
T
означает:
- Если
T
является (возможно, cv-квалифицированным) типом класса с предоставленным пользователем конструктором, тогда вызывается конструктор по умолчанию дляT
(и инициализация плохо сформирована, еслиT
не имеет доступного значения по умолчанию конструктор);- Если
T
является (возможно, cv-квалифицированным) классом типа non-union без созданного пользователем конструктора, тогда объект инициализируется нулем и, еслиT
неявно объявленный конструктор по умолчанию является нетривиальным, этот конструктор называется.- Если
T
- тип массива, то каждый элемент инициализируется значением;- , в противном случае объект инициализируется нулем.
И, наконец, §8.5/5:
Для нулевой инициализации объекта или ссылки типа
T
означает:
- , если
T
является скалярным типом, объект устанавливается в значение0
(ноль), взятое как интегральное постоянное выражение, преобразованное вT
;- if
T
- это (возможно, cv-квалифицированный) тип неединичного класса, каждый нестатический элемент данных и каждый подобъект базового класса инициализируются нулями, а заполнение инициализируется нулевыми битами;- Если
T
является (возможно, cv-квалифицированным) типом объединения, объекты первого нестатического именованного элемента данных инициализируются нулем, а заполнение инициализируется нулевыми битами;- if
T
- тип массива, каждый элемент инициализируется нулем;- Если
T
является ссылочным типом, инициализация не выполняется.