Si y no.
Depende de la versión de C ++ que estés usando.
- C ++ 98 y C ++ 03 no admiten
explicitoperadores de conversión de tipos
- Pero C ++ 11 lo hace.
Ejemplo,
struct A
{
operator int() { return 100; }
explicit operator std::string() { return "explicit"; }
};
int main()
{
A a;
int i = a;
std::string s = a;
}
Compílelo con g++ -std=c++0x, obtendrá este error:
prog.cpp: 13:20: error: conversión de 'A' a tipo no escalar 'std :: string' solicitada
Demostración en línea: http://ideone.com/DJut1
Pero tan pronto como escribas:
std::string s = static_cast<std::string>(a);
El error desaparece: http://ideone.com/LhuFd
Por cierto, en C ++ 11, el operador de conversión explícito se denomina "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.
toString, en lugar deoperator std::string. Por supuesto, esto puede causar problemas con algunas plantillas. Siempre lo he usadotoStringy nunca me ha causado ningún problema, pero imagino que esto podría depender de su estilo de codificación.operator std::string():-).to_stringen su lugar. Ayuda que sea lo que C ++ 11 lo llama, por lo que ayuda a escribir código compatible con versiones posteriores y ayuda con las plantillas.std::string s(a)ostd::string s{a}también debería funcionar comostatic_cast<std::string>(a).explicit operator bool()invoca contextualmente cuando escribeif(std::cin). Tenga en cuenta que la conversión que se produce aquí se denomina (informalmente) conversión contextual , no conversión implícita .