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
!tt && t2t || t2t ? "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 TEn cualquier lugar donde el Estándar requiera un tipo que satisfaga este concepto (por ejemplo, el tipo de
pointerde unstd::unique_ptr), se puede convertir contextualmente. Además, el valor de retorno de losNullablePointerde igualdad y desigualdad de unNullablePointerdebe ser convertible contextualmente abool.std::remove_if(first, last, [&](auto){ return t; });En cualquier algoritmo con un parámetro de plantilla llamado
PredicateoBinaryPredicate, el argumento del predicado puede devolver unaTstd::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 boolno es tan efectivo como se esperaba?