Erben von Konstruktoren und Initialisierern mit geschweiften Klammern
Ich verstehe nicht, warum Sie keine Klasse kompilieren können, die sowohl einen Member (nicht standardmäßig konstruierbar) mit einem Klammer- oder Gleichheitsinitialisierer als auch einen geerbten Konstruktor enthält. g ++ sagt:
test.cpp: 22: 15: Fehler: Verwendung der gelöschten Funktion 'Derived :: Derived (float)'
Derived d (1.2f);
test.cpp: 16: 13: Hinweis: "Derived :: Derived (float)" wird implizit gelöscht
weil die Standarddefinition falsch wäre:
using Base :: Base;
test.cpp: 16: 13: Fehler: Keine passende Funktion für den Aufruf von 'NoDefCTor :: NoDefCTor ()'
test.cpp: 5: 1: hinweis: kandidat:
NoDefCTor :: NoDefCTor (int) NoDefCTor (int) {}
Code, der nicht kompiliert werden kann (unter g ++ 5.1):
struct NoDefCTor
{
NoDefCTor(int) {}
};
struct Base
{
Base(float) {}
};
struct Derived : Base
{
using Base::Base;
NoDefCTor n2{ 4 };
};
int main()
{
Derived d(1.2f);
}
Code, der kompiliert, abernie benutzt NoDefCTor
's Standardkonstruktor (obwohl er anscheinend gebraucht wird!):
struct NoDefCTor
{
NoDefCTor(int) {}
NoDefCTor() = default;
};
struct Base
{
Base(float) {}
};
struct Derived : Base
{
using Base::Base;
NoDefCTor n2{ 4 };
};
int main()
{
Derived d(1.2f);
}
Ich mag die Idee, einen Standardkonstruktor zu haben, wenn ich keinen brauche, nicht wirklich. Nebenbei bemerkt, beide Versionen lassen sich auf MSVC14 problemlos kompilieren (und verhalten).