Il Clang documentation spiega perfettamente cheÈ anche un costruttore predefinito ereditato definito dall'utente?
Se una classe o struct ha alcun costruttore predefinito definito dall'utente, C++ non permetterà di default costruire un esempio const a come questo ([dcl.init] , p9)
il seguente codice ha una tale costruttore di default definita dall'utente per Base
, ma g ++ e Clang non sono d'accordo se il costruttore predefinito per Derived
è definito dall'utente, anche se Derived
fa ereditano esplicitamente tutte le Base
costruttori (utilizzando il new C++11 inheriting constructors feature)
#include <iostream>
class Base
{
public:
Base(): b_(0) {} // look! user-defined default constructor
void print() const { std::cout << b_ << "\n"; }
private:
int b_;
};
class Derived
:
public Base
{
using Base::Base; // does this constitute a user-defined default constructor?
};
int main()
{
Base const b;
b.print(); // 0 for g++ & CLang
Derived const d;
d.print(); // 0 for g++, Clang: "default initialization of an object of const type 'const Derived' requires a user-provided default constructor"
}
g ++ 4.8 accetta volentieri questo codice, ma Clang 3.3 non lo fa. Cosa dice lo standard?
NOTA: senza un costruttore di default definita dall'utente per Base
, né g ++ 4.8 né Clang 3,3 accettare Base const b;
(mentre ad esempio g ++ 4.7.2 precedentemente accettato che). Dato che g ++ conosce la regola, penso che ciò implichi che g ++ consideri il costruttore predefinito per Derived
come definito dall'utente. Ma Clang 3.3 pensa diversamente.
UPDATE: in base alla risposta @JesseGood s' che 0/1 costruttori argomenti non sono mai ereditati, ho provato a cambiare il costruttore Base
a
Base(int b = 0, void* = nullptr): b_(b) {}
ma non risolvere il problema Clang.
hai ragione, stavo fraintendendo la domanda. –