Bir kurucu başlatma listesinde {} başlatma, soyut türlere başvuruyu başlatırken() başlangıçtan farklı mıdır? Aşağıdaki sınıf Bar atın:Neden parens initializaton yaptığı zaman C++ 11 kurucu başlatma listesinde kıvırcık kaşlılık başlangıç işlemi çalışmıyor?
class AbstractBase
{
public:
AbstractBase() {}
virtual ~AbstractBase() = default;
virtual void ab() = 0;
};
class Foo : public AbstractBase
{
public:
Foo() {}
void ab() {}
};
class Bar
{
public:
Bar(const AbstractBase& base) : myBase{base} {}
private:
const AbstractBase& myBase;
};
int main()
{
Foo f{};
Bar b{f};
}
derleme, ben hatayı hattını derler ve iyi çalışır
Bar(const AbstractBase& base) : myBase(base) {}
değiştirilmesi
test5.cpp: In constructor ‘Bar::Bar(const AbstractBase&)’:
test5.cpp:22:48: error: cannot allocate an object of abstract type ‘AbstractBase’
Bar(const AbstractBase& base) : myBase{base}
^
test5.cpp:2:7: note: because the following virtual functions are pure within ‘AbstractBase’:
class AbstractBase
^
test5.cpp:8:18: note: virtual void AbstractBase::ab()
virtual void ab() = 0;
olsun.
Stroustrup'un C++ 11 kitabını okurken, std :: initializer_list <> ve diğerlerini alan kurucular arasında bir belirsizlik bulunmadığı durumlar hariç, çoğu durumda {} 'nın() ile aynı olduğu izlenimindeydim. Kurucular ve türlerin otomatik olarak kullanıldığı durumlar, bunların hiçbiri burada yapıyorum.
Başparmak kuralı: Öğeleri (sıfır dahil) içeren listeler için '{}' ve diğer kurucuları açıkça çağırmak için '()' kullanın. –
Aslında bu, referansların listesi başlatılmasıyla ilgili bir sorundur –
Aynı sorun burada olduğu gibi - http://stackoverflow.com/questions/19347004/copy-constructor-curly-braces-initialization –