2013-07-05 18 views
13

Clang documentation düzgünce bir sınıf veya yapı hiçbir kullanıcı tanımlı varsayılan kurucuyu sahiptirKullanıcı tarafından bildirilen varsayılan yapıcı + sınıf içi başlatıcılar! = Kullanıcı tarafından sağlanan kurucu?

ise C++ Eğer bu ([dcl.init] gibi bunun bir const örneğini oluşturmak varsayılan izin vermez açıklıyor p9)

Bir const nesnesi doğru şekilde başlatılmamışsa, daha sonra değiştirilemez. Ayrıca elverişlideğildir için

#include<iostream> 

class Test 
{ 
public: 
    Test() = default; 
    void print() const { std::cout << i << "\n"; } 
private: 
    int i = 42; // will propagate to the default constructor! 
}; 

int main() 
{ 
    Test const t; // <-- Clang chokes on the const keyword, g++ does not 
    t.print(); // prints 42 
} 

yüzden mantık varsayılan yapıcı bana gereksiz görünüyor sağlayarak, aşağıdaki kod Test için sadece bir kullanıcı tarafından ilan varsayılan kurucu vardır, ama tüm üyeleri sınıfının başlatıcıları var . Ve aslında, g ++ 4.8.1, Clang < = 3.2 = 0 olmasa da, problemsiz derler ( Online Example).

Sorular: neden tam in-sınıfı initalizer + kullanıcı tarafından bildirilen varsayılan yapıcı birleştirme varsayılan olarak bir const nesnesi oluşturmak için yeterli değil? C++ 14 Standard için bir düzeltme var mı?

UPDATE: Bu, Clang 3.2 ile karşılaştırılmış olup olmadığını görmek için 3.3/3.4 Clang'i deneyebilir mi?

+2

Bu bir hata/hata Clang olduğunu düşünüyorum ve g ++ kodu kabul etmek doğru. –

+0

@JerryCoffin Bununla birlikte gitmek için herhangi bir Standart teklif? Soruyorum çünkü sınıf içi başlatıcı olmadan, Standart Clang'ın haklı olduğunu söylüyor. – TemplateRex

+1

Gerçekten bir alıntı değil, ama N3337'ye göre, bu şartın ortadan kalkması için ifadeler çoktan değiştirilmişti. Standartta * olduğunu * kabul ettiğimde, bir hata veya hatayı çağırmak muhtemelen biraz yanlıştır, ama bu noktada çoğu derleyicinin çoğunlukla C++ 11 * değerini göz ardı ettiğini ve yeni taslakları takip ettiğini düşünüyorum. –

cevap

İlgili konular