tutorial studio programacion móviles libros español desarrollo desarrollar curso aprende aplicaciones c++ implicit-conversion

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 un std::unique_ptr ), se puede convertir contextualmente. Además, el valor de retorno de los NullablePointer de igualdad y desigualdad de un NullablePointer debe ser convertible contextualmente a bool .

  • std::remove_if(first, last, [&](auto){ return t; });

    En cualquier algoritmo con un parámetro de plantilla llamado Predicate o BinaryPredicate , el argumento del predicado puede devolver una T

  • std::sort(first, last, [&](auto){ return t; }); En cualquier algoritmo con un parámetro de plantilla llamado Compare , el argumento del comparador puede devolver una T

( source2 , source2 )

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?