Sim e não.
Depende de qual versão do C ++ você está usando.
- C ++ 98 e C ++ 03 não suportam
explicit
operadores de conversão de tipo
- Mas C ++ 11 sim.
Exemplo,
struct A
{
operator int() { return 100; }
explicit operator std::string() { return "explicit"; }
};
int main()
{
A a;
int i = a;
std::string s = a;
}
Compile-o com g++ -std=c++0x
, você obterá este erro:
prog.cpp: 13: 20: erro: conversão de 'A' para o tipo não escalar 'std :: string' solicitada
Demonstração online: http://ideone.com/DJut1
Mas assim que você escrever:
std::string s = static_cast<std::string>(a);
O erro desaparece: http://ideone.com/LhuFd
BTW, em C ++ 11, o operador de conversão explícita é referido como "operador de conversão contextual" se for convertido para booleano . Além disso, se você deseja saber mais sobre as conversões implícitas e explícitas, leia este tópico:
Espero que ajude.
toString
, em vez deoperator std::string
. Claro, isso pode causar problemas com alguns modelos. Sempre useitoString
e nunca me causou problemas, mas imagino que isso possa depender do seu estilo de codificação.operator std::string()
:-).to_string
vez disso. Ajuda que é como o C ++ 11 chama, então ajuda a escrever código compatível com versões futuras e ajuda com modelos.std::string s(a)
oustd::string s{a}
também deve funcionar comostatic_cast<std::string>(a)
.explicit operator bool()
é invocado contextualmente pelo compilador quando você escreveif(std::cin)
. Observe que a conversão que ocorre aqui é (informalmente) chamada de conversão contextual , não de conversão implícita .