Diciamo che ho il seguente codice in ciò che ci aspettiamo di diventare il prossimo standard C++:Ereditare costruttori in C++ 0x
int f(int x)
{
std::cout << x;
return x * x;
}
struct A
{
A(int x) : m_x(x) {}
int m_x;
};
struct B : A
{
using A::A;
B() : m_y(f(m_x)) {}
int m_y;
};
int main()
{
B(5);
}
sarebbe questo chiamare il costruttore di default di B e stampare 5 e impostare m_y = 25? O il costruttore predefinito di B non verrà eseguito e lascerà m_y non inizializzato?
E se quest'ultimo, qual è la logica dietro non chiamare il costruttore B predefinito? È abbastanza chiaro che A (int) B eredita solo inizializza A e lascia B in uno stato indeterminato. Perché C++ dovrebbe scegliere un comportamento non definito semplicemente chiamando il costruttore predefinito di B()? In gran parte sconfigge lo scopo della caratteristica dei costruttori ereditari.
Edit:
Forse questo dovrebbe essere consentito:
using A::A : m_y(...) { std::cout << "constructing..." << std::endl; ...; }
m_y sarà inizializzato, utilizzando A :: A, è otterrà qualcosa di simile a questo: B :: B (int x): A :: m_x (x) {}. O qualcosa :) – hidayat
C++ sceglie effettivamente di compilare il codice con errore in quanto non si fornisce il costruttore predefinito per A. È _non_ un comportamento non definito :) – user396672