Heredar constructores e inicializadores de llaves o iguales
No entiendo por qué no puede compilar una clase que tiene un miembro (no construible por defecto) con un inicializador de paréntesis o igual y un constructor heredado. g ++ dice:
test.cpp: 22: 15: error: uso de la función eliminada "Derivado :: Derivado (flotante)"
Derivado d (1.2f);
test.cpp: 16: 13: nota: "Derivado :: Derivado (flotante)" se elimina implícitamente
porque la definición predeterminada estaría mal formada:
usando Base :: Base;
test.cpp: 16: 13: error: no hay función coincidente para la llamada a "NoDefCTor :: NoDefCTor ()"
test.cpp: 5: 1: nota: candidato:
NoDefCTor :: NoDefCTor (int) NoDefCTor (int) {}
Código que no se compila (en 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);
}
Código que compila, peronunca usa NoDefCTor
El constructor predeterminado (¡a pesar de que aparentemente lo necesita!):
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);
}
Realmente no me gusta la idea de tener un constructor predeterminado cuando no lo necesito. En una nota al margen, ambas versiones compilan (y se comportan) muy bien en MSVC14.