Digamos que tengo el siguiente código en lo que se espera para convertirse en el próximo C++ estándar:constructores La herencia en 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);
}
Sería esto llamar al constructor por defecto de B e imprimir 5 y establecer m_y = 25? ¿O no se ejecutará el constructor predeterminado de B y dejará m_y sin inicializar?
Y si este último, ¿cuál es la razón detrás de no llamar al constructor predeterminado B? Está bastante claro que el A (int) B hereda solo la inicialización A, y deja a B en un estado indeterminado. ¿Por qué elegiría C++ un comportamiento indefinido simplemente llamando al constructor predeterminado de B()? En gran medida, infringe el objetivo de la función heredar constructores.
Editar:
Tal vez esto se debe permitir:
using A::A : m_y(...) { std::cout << "constructing..." << std::endl; ...; }
m_y será inicializado, mediante el uso de A :: A, obtendrá algo como esto: B :: B (int x): A :: m_x (x) {}. O algo :) – hidayat
C++ realmente elige compilar el código con error, ya que no proporciona el constructor predeterminado para A. No es un comportamiento indefinido :) – user396672