2015-09-25 17 views
21

Ne şu örnekle açıklanabilir anlamına atın:std :: make_shared değer başlatmayı gerçekleştiriyor mu (GCC ve clang katılmıyorum)?

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

int değişken varsayılan (böylece çöp değeri var) veya değer başlatıldı başlatıldı mı (böylece sıfır değerine sahip)? Ben GCC 5.2 ve clang 3.6 üzerinde eski değer sıfırlama yapıyor ve ikincisi varsayılan başlatma yapıyor test ettik. Bu konuda standart ne diyor merak ediyorum? Benim düşünceme göre, modern C++ bu durumda kesinlikle değer sıfırlamayı gerçekleştirmelidir.

+0

_ "GCC 5.2 ve clang 3.6 üzerinde test ettim, eski değer sıfırlama işlemini yapıyor ve ikincisi varsayılan başlatma yapıyor."_ Ben clang için sonuç tarafından şaşırdım, nasıl test ettin? –

+0

@JonathanWakely Ben cppref gömülü online derleyici üzerinde test etti. – Lingxi

+1

Ama nasıl? Davranış doğrulamak için hangi kodu yazdınız? –

cevap

22

Evet. T türü bir nesne için uygun

N3797 20.8.2.2.6

bellek ayırır ve burada olacak, ::new (pv) T(std::forward<Args>(args)...)

Böylece yeni yerleşimde ifadesi ile bellekteki bir nesne oluşturur N3797 8.5.1

tarafından böyle devam

::new (pv) int(); 

Ve olmak

formları

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

hem de yeni ifadelerde (5.3.4)

meydana başlatma direkt başlatma olarak adlandırılır.

Başlatıcıların semantiği aşağıdaki gibidir. Hedef türü olup başlatılan nesnenin veya referansın türü ve kaynak türü başlatıcı ifadesinin türüdür. Başlatıcı tek (muhtemelen parantezize edilmiş) bir ifade değilse, kaynak türü tanımlı değil 'dur.

- Başlatıcı () ise, nesne değer başlatılır. aksi halde, bir nesne sıfır başlatıldı -

:

için tip T bir amacı anlamına değeri-başlat.

Ve yeni çınlama ve KİK hem standart ile anlaşmak: Live

6

standart senin görüşünü destekler niteliktedir. 20.8.2.2.6 itibaren

:

yerleşim yeni ifade :: yeni (pv) T aracılığıyla bu bellekte bir nesne oluşturur (std :: ileri (args) ...)

Yeni int() yeni int ile karşıt olarak başlatılan değer olduğundan, sıfır beklerim.

İlgili konular