c++ - studio - ¿Cuándo puedo usar el operador explícito bool sin un lanzamiento?
programacion android pdf 2018 (1)
Mi clase tiene una conversión explícita a bool:
struct T {
explicit operator bool() const { return true; }
};
Y tengo un ejemplo de ello:
T t;
Para asignarlo a una variable de tipo bool
, necesito escribir una conversión:
bool b = static_cast<bool>(t);
bool b = bool(t);
bool b(t); // converting initialiser
bool b{static_cast<bool>(t)};
Sé que puedo usar mi tipo directamente en un condicional sin una conversión, a pesar del calificador explicit
:
if (t)
/* statement */;
¿Dónde más puedo usar t
como bool
sin un molde?
El estándar menciona lugares donde un valor puede ser " convertido contextualmente a bool
" . Se dividen en cuatro grupos principales:
Declaraciones
if (t) /* statement */;
for (;t;) /* statement */;
while (t) /* statement */;
do { /* block */ } while (t);
Expresiones
!t
t && t2
t || t2
t ? "true" : "false"
Pruebas de tiempo de compilación
El operador debe estar constexpr
para estos:
static_assert(t);
noexcept(t)
if constexpr (t)
Algoritmos y conceptos
NullablePointer T
En cualquier lugar donde el Estándar requiera un tipo que satisfaga este concepto (por ejemplo, el tipo de
pointer
de unstd::unique_ptr
), se puede convertir contextualmente. Además, el valor de retorno de losNullablePointer
de igualdad y desigualdad de unNullablePointer
debe ser convertible contextualmente abool
.std::remove_if(first, last, [&](auto){ return t; });
En cualquier algoritmo con un parámetro de plantilla llamado
Predicate
oBinaryPredicate
, el argumento del predicado puede devolver unaT
std::sort(first, last, [&](auto){ return t; });
En cualquier algoritmo con un parámetro de plantilla llamadoCompare
, el argumento del comparador puede devolver unaT
Tenga en cuenta que una combinación de operadores de conversión const y non-const puede causar confusión:
- ¿Por qué la conversión bool () explícita no ocurre en la conversión contextual?
- ¿Por qué el
explicit operator bool
no es tan efectivo como se esperaba?