2015-09-25 4 views
21

Что я беру в виду, можно объяснить на следующем примере:Выполняет std :: make_shared инициализацию значения (GCC и clang не согласны)?

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

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

+0

_ «Я тестировал на GCC 5.2 и clang 3.6 с первым инициализацией инициализации, а последний выполнял инициализацию по умолчанию.«_ Я удивлен вашим результатом для clang, как вы его протестировали? –

+0

@JonathanWakely Я тестировал его на онлайн-компиляторе, встроенном в cppref. – Lingxi

+1

Но как? Какой код вы писали для проверки поведения? –

ответ

22

Да.

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) называется прямой инициализации.

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

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

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

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

И как новый лязг и ССАГПЗ согласны со стандартом: Live

6

стандарт, кажется, поддерживает свое мнение.

От 20.8.2.2.6:

строит объект в этой памяти с помощью размещения нового экспрессии :: нового (Рв) T (станд :: вперед (арг) ...)

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

Смежные вопросы