Подтвердить что ты не робот

Выполняет ли std:: make_shared инициализацию значения (GCC и clang не согласны)?

То, что я имею в виду, можно объяснить следующим примером:

auto p = std::make_shared<int>();

Является ли инициализированная переменная int инициализирована по умолчанию (таким образом, имеет значение мусора) или инициализируется значение (таким образом, значение равно нулю)? Я тестировал GCC 5.2 и clang 3.6, причем первая выполняла инициализацию значения, а вторая выполняла инициализацию по умолчанию. Мне интересно, что говорит об этом стандарт? На мой взгляд, современный С++ должен обязательно выполнять инициализацию значения в этом случае.

4b9b3361

Ответ 1

Да.

N3797 20.8.2.2.6

Выделяет память, подходящую для объекта типа T, и создает объект в этой памяти через новое выражение размещения ::new (pv) T(std::forward<Args>(args)...)

Итак, здесь будет

::new (pv) int();

И так далее N3797 8.5.1

Инициализация, которая происходит в формах

T x(a);
T x{a};

а также в новых выражениях (5.3.4) называется прямой инициализацией.

Семантика инициализаторов следующая. Тип назначения - тип инициализированного объекта или ссылки и источник type - тип выражения инициализатора. Если инициализатор не одно (возможно, в скобках) выражение, тип источника не определено.

- Если инициализатором является (), объект инициализируется значением.

Для инициализации значения объекта типа T означает:

- в противном случае объект инициализируется нулем.

И оба новых clang и GCC согласны со стандартом: Live

Ответ 2

Стандарт, похоже, поддерживает ваше мнение.

Из 20.8.2.2.6:

создает объект в этой памяти через размещение new-expression:: new (pv) T (std:: forward (args)...)

Поскольку новый int() инициализируется значением, в отличие от нового int, я ожидал бы нуль.