uso - variable char c++
bool vs void*se lanza sobre el mismo objeto (2)
El código a continuación imprime ''bool del operador'' cuando se usa en la declaración if y ''void del operador *'' cuando necesita un bool para la llamada de función.
¿Por qué no está utilizando también el operator bool
para la llamada de función? ¿Y cómo hacerlo usarlo en ambos casos?
#include <iostream>
class A
{
public:
explicit operator bool() const
{
std::cout << "operator bool" << std::endl;
return true;
}
operator void*() const
{
std::cout << "operator void*" << std::endl;
return 0;
}
};
void f(bool valid)
{
std::cout << "f called " << valid << std::endl;
}
int main(int argc, char *argv[])
{
A a;
if(a)
std::cout << "if a" << std::endl;
f(a);
return 0;
}
El motivo es que el operador se declara con el especificador de función explicit
.
En la condición de la sentencia if, el valor se convierte contextualmente al tipo bool.
Desde el estándar de C ++ (4 conversiones estándar)
2 [Nota: las expresiones con un tipo dado se convertirán implícitamente a otros tipos en varios contextos:
...
- Cuando se utiliza en la condición de una instrucción if o una declaración de iteración (6.4, 6.5). El tipo de destino es bool.
Sin embargo, cuando el valor se pasa a la función como un argumento, se utiliza la llamada inicialización de copia. En este caso, el especificador de la función explícita evita la conversión al tipo bool.
Desde el estándar de C ++ (12.3.2 Funciones de conversión)
2 Una función de conversión puede ser explícita (7.1.2), en cuyo caso solo se considera una conversión definida por el usuario para la inicialización directa (8.5). De lo contrario, las conversiones definidas por el usuario no están restringidas para usarse en asignaciones e inicializaciones.
Una forma sencilla de forzar la llamada al operador bool es la siguiente
f( bool( a ) );
En una sentencia if
, se consideran los operadores de conversión implícitos y explícitos. Debido a que A
tiene un operator bool
, elige ese uno, ya que es una mejor coincidencia que convertir A
en un void*
y luego convertirlo en bool
.
Pero en todas las demás declaraciones, que no son condiciones ( if
, while
, ...), los operadores de conversión explícitos no participan en la resolución de sobrecarga, y el único operador válido es el operator void*
, que se puede usar porque hay un Conversión implícita de punteros a bool
.
Si desea que se seleccione el operator bool
, debe hacerlo no explicit
, o usar una conversión (porque eso es lo que significa marcarlo explicit
, asegurándose de que haya que ser explícito para usarlo):
f(static_cast<bool>(a));