Al diseñar una API pública, ¿es una buena práctica hacer que el constructor sea explícito?¿Es una buena práctica hacer que el constructor sea explícito?
class A {
public:
//explicit A(int i){}
A(int i){}
};
void fun(const A& a) {}
int main() {
// If I use explicit for A constructor, I can prevent this mistake.
// (Or shall I call it as feature?)
fun(10);
}
¿O debo permitir la conversión implícita, para permitir que el usuario llame a mi API con menos tipeo?
ejemplo de conversión implícita: any numberlikelike (p. Ej.una biblioteca bignum, o una biblioteca de fecha/hora) - contra la conversión implícita: simplemente considere la clase 'std :: vector' que se puede inicializar con un tamaño inicial. –
Estoy de acuerdo con esto. IME rara vez hay un caso en el que desee un casting implícito y si se equivoca en el lado explícito, no se hace daño al forzar a los usuarios a unas pocas pulsaciones más. – sbi
Como ejemplo: la conversión implícita de doble a complejo a través de 'complex (double re, double im = 0)' tiene sentido, pero la conversión de int a vector a través de 'vector (int size)' no. –