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).

Antworten auf die Frage(2)

Ihre Antwort auf die Frage