C++Conversiones de tipo explícito


Introducción

Una expresión puede ser convertido o fundido para escribir explícitamente T usando dynamic_cast<T> , static_cast<T> , reinterpret_cast<T> , o const_cast<T> , dependiendo de qué tipo de molde que se pretende.

C ++ también admite la notación de conversión de estilo de función, T(expr) y la notación de conversión de estilo de C, (T)expr .

Sintaxis

  • especificador de tipo simple ( )
  • especificador de tipo simple ( expresión-lista )
  • especificador de tipo simple braced-init-list
  • typename-specifier ( )
  • typename-specifier ( expresión-lista )
  • nombre de archivo-especificador braced- init-list
  • dynamic_cast < type-id > ( expresión )
  • static_cast < type-id > ( expresión )
  • reinterpret_cast < type-id > ( expresión )
  • const_cast < type-id > ( expresión )
  • ( type-id ) expresión-cast

Observaciones

Las seis notaciones emitidas tienen una cosa en común:

  • La dynamic_cast<Derived&>(base) a un tipo de referencia dynamic_cast<Derived&>(base) , como en dynamic_cast<Derived&>(base) , produce un lvalue. Por lo tanto, cuando desea hacer algo con el mismo objeto pero tratarlo como un tipo diferente, se convertiría a un tipo de referencia de valor l.
  • La conversión a un tipo de referencia de rvalue, como en static_cast<string&&>(s) , produce un rvalue.
  • La conversión a un tipo que no es de referencia, como en (int)x , produce un prvalue, que puede considerarse como una copia del valor que se está emitiendo, pero con un tipo diferente del original.

La palabra clave reinterpret_cast es responsable de realizar dos tipos diferentes de conversiones "inseguras":

La palabra clave static_cast puede realizar una variedad de diferentes conversiones:

  • Base a conversiones derivadas

  • Cualquier conversión que se pueda realizar mediante una inicialización directa, incluidas las conversiones implícitas y las conversiones que llaman a un constructor explícito o una función de conversión. Vea aquí y aquí para más detalles.

  • Para void , lo que descarta el valor de la expresión.

    // on some compilers, suppresses warning about x being unused
    static_cast<void>(x);
    
  • Entre los tipos aritméticos y de enumeración, y entre diferentes tipos de enumeración. Ver las conversiones de enumeración

  • Del puntero al miembro de la clase derivada, al puntero del miembro de la clase base. Los tipos apuntados deben coincidir. Ver conversión derivada a base para punteros a miembros

  • void* a T* .

C ++ 11

Conversiones de tipo explícito Ejemplos relacionados