Bu mantığı da açıklanmaktadır olamaz, ama ben bariz tekrarlayabilirsiniz.
Ben bu şaşırtıcı buldum. Bu kodun derlenmediği C++ 11 standardının amacı nedir? Açık bir kurucu seçilirse
kopya-list-başlatma olarak
§13.3.1.7
, başlatma kötü oluşturulur.
Çıkarma = düzelir: Ben şahsen yıllardır = ile forma kullanılmıştır insanlara anlatmak bu zor bulmak ve standart bir atıfta beri Foo foo { 42 };
ama eski güzel yolu bu senaryoda neden çalışmıyor "ayracı-veya-eşit-başlatıcı" değil açıktır.
Foo foo { 42 }
eşittir işareti oysa copy-list-initialization yapar (parantez ile), direct initialization olup. derleme copy-initialization (parantez olmadan eşittir işareti) için başarısız çünkü başka cevap nedenleri, o zaman o da kopyalama liste başlatılması için başarısız olması şaşırtıcı olmamalıdır, ancak iki farklı nedenlerle başarısız.
cppreference:
Doğrudan başlatma kopyalamaya karşı başlatma daha hoşgörülü geçerli: kopya-başlatma sadece, açık olmayan kurucular ve kullanıcı tanımlı dönüşüm fonksiyonlarını dikkate direkt başlatma tüm Kurucular gördüğü süre ve örtük dönüşüm dizileri.
Ve explicit specifier üzerindeki sayfa:
Kurucular ve belirtir örtük dönüşüm ya kopya-başlatma izin vermez dönüşüm operatörleri (C++ 11 beri). kopyalamaya listesi başlatılması için Öte yandan
:
T nesne = {ARG1, arg2, ...};
10 (10)
) eşittir sağ tarafında iki aşamalı olarak,
What could go wrong if copy-list-initialization allowed explicit constructors?'da açıklandığı gibi, açık yapıcı seçildiğinden, ancak kullanılmasına izin verilmediğinden derleme başarısız olur.
'{}' başlatıcı sözdizimi bir tür kesmek gibidir ve bu –
gibi garip köşe durumları bir demet vardır Ben çift köşeli ayraç kullanmak zorunda olduğunu düşündüm - Foo foo = {{42}}; –
@CarlBurnett: Çift köşeli ayraçlar aynı şeyi tek parantez gibi görünüyor - hala bozuk. –