2011-11-23 20 views
77

Cuando se trata de constructores, agregar la palabra clave explicit impide 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?¿Puede un operador de reparto ser explícito?

struct Foo 
{ 
    operator std::string() const; 
}; 

Aquí, por ejemplo, me gustaría ser capaz de lanzar Foo en un std::string, pero no quiero tales fundido a suceder de forma implícita.

Respuesta

94

Sí y No.

Depende de la versión de C++, que está utilizando.

  • C++ y C++ 98 03 no son compatibles con explicit operadores de conversión de tipo
  • Pero C++ 11 no.

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 
} 

Compilarlo con g++ -std=c++0x, obtendrá este error:

prog.cpp:13:20: error: conversion from 'A' to non-scalar type 'std::string' requested

demostración en línea: http://ideone.com/DJut1

Pero tan pronto como se escribe:

std::string s = static_cast<std::string>(a); //ok - explicit conversion 

El error desaparece: http://ideone.com/LhuFd

BTW, en C++ 11, el operador de conversión explícita se refiere como "operador contextual conversión" si se convierte en boolean. Además, si usted quiere saber más acerca de las conversiones implícitas y explícitas, lea este tema:

Espero que ayude.

+1

+1. ¿Podría publicar un ejemplo del código C++ 11, por favor? – FailedDev

+1

@FailedDev: Listo. :-) – Nawaz

+1

¡Muchas gracias! – FailedDev

Cuestiones relacionadas