Wenn ich diesen code ausführen:
struct X {
int a;
};
struct Y : public X {};
X x = {0};
Y Y = {0};
Bekomme ich:
error: could not convert ‘{0}’ from ‘<brace-enclosed initializer list>’ to ‘Y’
Warum brace-Initialisierung arbeiten für die Basisklasse, nicht aber die abgeleitete Klasse?
InformationsquelleAutor Eric | 2013-06-07
Deinem problem zu tun hat, mit Aggregat-Initialisierung:
struct X
ist ein Aggregat, währendstruct Y
ist nicht. Hier ist die standard-Zitat über die Aggregate (8.5.1):Diese Klausel legt fest, dass, wenn ein
class
hat eine Basis-Klasse, dann ist es kein Aggregat ist. Hierstruct Y
hatstruct X
als Basis-Klasse und daher nicht in ein Aggregat-Typ.Hinsichtlich der konkreten Problems, das Sie haben, nehmen Sie die folgende Klausel aus dem standard:
Wenn Sie
X x = {0}
-, Aggregat-Initialisierung initialisiert wirda
zu0
. Allerdings, wenn Sie tunY y = {0}
, dastruct Y
ist nicht ein Aggregat-Typ, den der compiler sucht nach einem geeigneten Konstruktor. Da keiner der implizit generierten Konstruktoren (default, kopieren und verschieben) Sie können alles tun, mit einem einzigen integer-Zahl, die der compiler lehnt den code.Zu diesem Konstruktoren-lookup, werden die Fehlermeldungen von clang++ sind ein bisschen deutlicher über das, was der compiler tatsächlich versuchen zu tun (online-Beispiel):
Beachten Sie, dass es ein Vorschlag zu erweitern Aggregat-Initialisierung, zur Unterstützung Ihrer Nutzung Fall und es in C++17. Wenn ich es richtig lese, macht es das Beispiel gilt mit der Semantik, die Sie erwarten. So... Sie haben nur zu warten, für eine C++ - 17-konformen compiler.
clang++ -std=c++1z
version 4.0.1 kompiliertg++ -std=c++17
version 7.2.1 kompiliert, aber Visual Studio 2017cl
version 19.12.25816 noch nichtSollte unterstützt seit diesem Sommer mit VS 2017 15.7
InformationsquelleAutor Morwenn