W jaki sposób inicjalizacja {} na liście inicjalizacji konstruktora różni się od inicjalizacji() podczas inicjowania odwołania do typów abstrakcyjnych? Take poniżej class Bar:Dlaczego inicjalizacja C++ 11 inicjalizująca nawias klamrowy na liście inicjalizacyjnej konstruktora nie działa podczas inicjowania parens?
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};
}
Podczas kompilacji, pojawia się błąd
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;
Zmiana linii
Bar(const AbstractBase& base) : myBase(base) {}
kompiluje i działa poprawnie.
Czytając książkę C++ 11 w Stroustrup, miałem wrażenie, że {} było takie samo jak() w większości przypadków, z wyjątkiem sytuacji, gdy istniała niejednoznaczność między konstruktorami, którzy pobierają std :: initializer_list <> i inne konstruktorzy i przypadki, w których używa się auto jako typu, z których żadne tutaj nie robię.
Moja zasada: Użyj '{} dla list elementów (w tym zera), a'() 'do jawnego wywołania dowolnego innego konstruktora. –
To jest rzeczywiście problem związany z inicjowaniem listy referencji –
Ten sam problem co tutaj - http://stackoverflow.com/questions/19347004/copy-constructor-curly-braces-initialization –