"convertible to bool" simplemente significa cualquier cosa que se pueda usar significativamente en un contexto booleano (por ejemplo, en una condición if
). Esto tiene sentido en las conversiones implícitas. Imagine un objeto que desea usar en un contexto booleano, p. std::fstream
:
ifstream ifs("filename");
while (ifs >> token)
cout "token " << token << " read." << endl;
Aquí, ifs
es convertible a booleano. Bueno, en realidad, no lo es. Más bien, es convertible a algo que, a su vez, es convertible a bool
. Esto es para evitar este tipo de declaraciones:
int b = ifs;
El razonamiento es que tal declaración es muy probable que no pretende, por lo que el compilador debe impedirlo. Al devolver un "convertible a bool" en lugar de un bool
, esto se logra porque dos conversiones implícitas definidas por el usuario no se pueden encadenar en una expresión.
En este contexto, es posible que desee buscar el safe bool idiom. Chris ya hizo alusión a una implementación posible, utilizando void*
como tipo de devolución. Normalmente, el puntero this
se utiliza para representar true
. Esto es lo que usa el STL. Sin embargo, esto lamentablemente sigue siendo defectuoso. Se han propuesto varias alternativas (perfectamente resumidas en el artículo que he vinculado anteriormente) y, hasta donde yo sé, también se han incluido en C++ 0x para su consideración. Sin embargo, no estoy al tanto del estado actual de estas propuestas.
Ese es el artículo que no he podido encontrar. ¡Gracias! –
El estado actual son los operadores de conversión explícitos, que hacen que la expresión bool segura sea superflua. –
@Sebastian, ¿o sí? Will "if (f)" llamará al operador explícito bool() o necesitará "if (bool (f))"? No es como si el estándar define el parámetro para si es bool, simplemente convertible a bool. – jmucchiello