2015-09-25 12 views
21

Co biorę oznaczać można wyjaśnić w poniższym przykładzie:Czy std :: make_shared dokonuje inicjalizacji wartości (GCC i clang disagree)?

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

Czy zmienna domyślna int zainicjowana (a więc mają wartość śmieci) lub wartość zainicjowana (zatem mieć wartość zero)? Przetestowałem na GCC 5.2 i klang 3.6, gdy pierwszy wykonuje inicjalizację wartości, a drugi wykonuje domyślną inicjalizację. Zastanawiam się, co standard mówi na ten temat? Moim zdaniem, nowoczesne C++ powinno zdecydowanie wykonać inicjalizację wartości w tym przypadku.

+0

_ "Testowałem na GCC 5.2 i klang 3.6 z poprzednią wartością inicjującą i drugą wykonującą domyślną inicjalizację."Jestem zaskoczony twoim wynikiem za klang, jak to przetestowałeś?" –

+0

@ JonathanWakely Testowałem go na kompilatorze online osadzonym w cppref – Lingxi

+1

Ale jak? Jaki kod napisałeś, aby zweryfikować zachowanie? –

Odpowiedz

22

Tak.

N3797 20.8.2.2.6 pamięć

Przydziela nadaje się do obiektu typu T i konstruuje przedmiot w tej pamięci poprzez umieszczenie nowej ekspresji ::new (pv) T(std::forward<Args>(args)...)

Tak, tutaj być

::new (pv) int(); 

I tak dalej przez N3797 8.5.1

inicjalizacji, która występuje w postaci

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

jak również w nowych określeń (5.3.4) jest określany jako bezpośredni inicjalizacji.

Semantyka inicjalizatorów jest następująca. Typem docelowym jest typ inicjalizowanego obiektu lub odwołania, a typ źródłowy to typ wyrażenia inicjalizującego. Jeśli inicjalizator to , a nie pojedyncze wyrażenie (prawdopodobnie w nawiasie), typ źródła nie jest zdefiniowany jako .

- Jeśli inicjalizatorem jest (), obiekt jest inicjowany wartością.

do wartości inicjalizacji obiekt typu T oznacza

- w przeciwnym razie, obiekt jest zero zainicjowana.

I zarówno nowy dzyń i GCC uzgodnić ze standardem: Live

6

Standard wydaje się wspierać swoją opinię.

Od 20.8.2.2.6:

konstruuje przedmiot w tej pamięci poprzez umieszczenia nowej ekspresji :: nowy (PV) T (std :: forward (args) ...)

Ponieważ nowa int() jest zainicjowana wartością, w przeciwieństwie do nowej int, oczekiwałbym zerowego.

Powiązane problemy