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?
Bu bir hata/hata Clang olduğunu düşünüyorum ve g ++ kodu kabul etmek doğru. –
@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
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. –