Si y no.
Depende de la versión de C ++ que estés usando.
- C ++ 98 y C ++ 03 no admiten
explicit
operadores 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 usadotoString
y nunca me ha causado ningún problema, pero imagino que esto podría depender de su estilo de codificación.operator std::string()
:-).to_string
en 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 .