c++ - ¿Puede un operador de reparto ser explícito?
casting operator-keyword (1)
Si y no.
Depende de qué versión de C ++ estés usando.
- C ++ 98 y C ++ 03 no admiten operadores
explicit
conversión de tipo - Pero C ++ 11 sí.
Ejemplo,
struct A
{
//implicit conversion to int
operator int() { return 100; }
//explicit conversion to std::string
explicit operator std::string() { return "explicit"; }
};
int main()
{
A a;
int i = a; //ok - implicit conversion
std::string s = a; //error - requires explicit conversion
}
Compile con g++ -std=c++0x
, obtendrá este error:
prog.cpp: 13: 20: error: conversión de ''A'' a tipo no escalar ''std :: string'' solicitado
Demostración en línea: http://ideone.com/DJut1
Pero tan pronto como escribes:
std::string s = static_cast<std::string>(a); //ok - explicit conversion
El error desaparece: http://ideone.com/LhuFd
Por cierto, en C ++ 11, el operador de conversión explícito se conoce como "operador de conversión contextual" si se convierte en booleano . Además, si desea obtener más información sobre las conversiones implícitas y explícitas, lea este tema:
Espero que ayude.
Cuando se trata de constructores, agregar la palabra clave explicit
evita que un compilador entusiasta cree un objeto cuando no era la primera intención del programador. ¿Hay tal mecanismo disponible para los operadores de casting también?
struct Foo
{
operator std::string() const;
};
Aquí, por ejemplo, me gustaría poder convertir a Foo
en una std::string
, pero no quiero que ese molde se produzca implícitamente.