C++Conversioni di tipo esplicito


introduzione

Un'espressione può essere convertita o cast esplicita per digitare T usando dynamic_cast<T> , static_cast<T> , reinterpret_cast<T> , o const_cast<T> , a seconda del tipo di cast desiderato.

C ++ supporta anche la notazione cast in stile funzione, T(expr) e la notazione cast in stile C, (T)expr .

Sintassi

  • identificatore di tipo semplice ( )
  • identificatore di tipo semplice ( elenco di espressioni )
  • semplice-tipo-identificatore braced-init-list
  • typename-specificifier ( )
  • typename-specificifier ( expression-list )
  • typename-specifier braced-init-list
  • dynamic_cast < id-tipo > ( espressione )
  • static_cast < id-tipo > ( espressione )
  • reinterpret_cast < id-tipo > ( espressione )
  • const_cast < id-tipo > ( espressione )
  • ( type-id ) cast-expression

Osservazioni

Tutte e sei le annotazioni sul cast hanno una cosa in comune:

  • Il casting su un tipo di riferimento lvalue, come in dynamic_cast<Derived&>(base) , produce un lvalue. Pertanto, quando si vuole fare qualcosa con lo stesso oggetto ma trattarlo come un tipo diverso, si passa a un tipo di riferimento lvalue.
  • La trasmissione a un tipo di riferimento di rvalue, come in static_cast<string&&>(s) , produce un valore rvalue.
  • Il casting su un tipo non di riferimento, come in (int)x , produce un valore, che può essere considerato come una copia del valore da trasmettere, ma con un tipo diverso dall'originale.

La parola chiave reinterpret_cast è responsabile dell'esecuzione di due diversi tipi di conversioni "non sicure":

La parola chiave static_cast può eseguire una varietà di conversioni diverse:

  • Base per conversioni derivate

  • Qualsiasi conversione che può essere eseguita tramite un'inizializzazione diretta, incluse conversioni e conversioni implicite che chiamano una funzione di costruzione o conversione esplicita. Vedi qui e qui per maggiori dettagli.

  • Per void , che scarta il valore dell'espressione.

    // on some compilers, suppresses warning about x being unused
    static_cast<void>(x);
    
  • Tra i tipi aritmetici e di enumerazione e tra i diversi tipi di enumerazione. Vedi conversioni enum

  • Da puntatore a membro della classe derivata, puntatore al membro della classe base. I tipi a cui punta devono corrispondere. Vedi la conversione da derivata a base per i puntatori ai membri

  • void* a T* .

C ++ 11

Conversioni di tipo esplicito Esempi correlati