Una razón sin duda es porque no duele
Una razón por la que se necesita es, si tiene argumentos predeterminados para el primer parámetro.El constructor se convierte en un constructor por defecto, pero todavía se puede utilizar como constructor de conversión de
struct A {
explicit A(int = 0); // added it to a default constructor
};
C++ 0x hace uso real de la misma para los constructores de parámetros múltiples. En C++ 0x, se puede utilizar una lista de inicializadores para inicializar un objeto de clase. La filosofía es
si utiliza = { ... }
, a continuación, se inicializa el objeto con una especie de "valor compuesto" que conceptualmente representa el valor abstracto del objeto, y que desea han convertido al tipo.
si utiliza un inicializador { ... }
, llame directamente a los constructores del objeto, no necesariamente que desee especificar una conversión.
Considere este ejemplo
struct String {
// this is a non-converting constructor
explicit A(int initialLength, int capacity);
};
struct Address {
// converting constructor
Address(string name, string street, string city);
};
String s = { 10, 15 }; // error!
String s1{10, 15}; // fine
Address a = { "litb", "nerdsway", "frankfurt" }; // fine
De esta manera, C++ 0x indica que la decisión de C++ 03, para permitir explícita sobre otros constructores, no era una mala idea en absoluto .
¿Por qué se puede prevenir? – Falmarri
Falmarri: Si no se previene, ¿hay algún ejemplo en el que sea útil en un constructor predeterminado o en un constructor de parámetros> = 2? –
Ver la respuesta de Adrian. ¿Por qué deberías prevenirlo? – Falmarri