2008-11-04 12 views
6

Varias veces, al leer detenidamente la documentación de la biblioteca Boost, he encontrado valores devueltos que están marcados como "convertible to bool" (busque en esa página la frase "convertible a bool", es aproximadamente un tercio del camino hacia abajo). Una vez tropecé con una referencia oblicua a un documento explicando el motivo, pero nunca he podido encontrar dicho papel (y ya no puedo encontrar la página en la que vi la referencia).¿Por qué las bibliotecas de Boost devuelven cosas "convertibles a` bool` "en lugar de simplemente devolver` bool`s?

¿Alguien puede explicar por qué (y cuándo) debe devolver algo que es "convertible a bool" en lugar de simplemente devolver un bool?

Respuesta

25

"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.

+0

Ese es el artículo que no he podido encontrar. ¡Gracias! –

+1

El estado actual son los operadores de conversión explícitos, que hacen que la expresión bool segura sea superflua. –

+0

@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

0

¿Quizás para el rendimiento? En C/C++ puede hacer una instrucción if en los números (0 es falso, cualquier otra cosa es verdadera). La conversión a un bool estricto es una operación adicional, que en muchos casos no sería necesaria.

No he usado boost, así que es solo una suposición, pero me parece razonable.

11

bool s son promocionales a int sy pueden participar en operaciones aritméticas. A menudo, este no es el resultado deseado, cuando un valor solo debe usarse para la prueba de la verdad.

Un convertible a bool es generalmente algo así como un void*, donde el puntero nulo es falso, y todo lo demás es verdadero y, sin embargo, no se puede usar para operaciones aritméticas.

Cuestiones relacionadas