Domanda

Sezione 4.5 dello standard C ++ (promozione intero) parla di casi specifici di conversione di tipi integrali ai tipi con un rango superiore.

Sezione 4.7 dello standard (conversioni integrali) C ++ inizia con (proiettile 4.7.1):

  

Un rvalue di tipo intero può essere convertito in un altro tipo di rvalue intero. Un rvalue di un tipo di enumerazione può essere convertito in un rvalue di un tipo intero.

Per quanto ho capito conversioni descritti in 4.5 (forse fatta eccezione per il proiettile 4.5.3 (enum)) possono essere eseguite utilizzando le tecniche da 4,7 sezione da solo: 4.5.1 e 4.5.2 sono completamente coperti da 4.7. 1; 4.5.4 è coperto da 4.7.4. Allora, qual è lo scopo di tutta la sezione 4.5? Quali conversioni aggiuntive vuol abilitare? Forse mi manca alcune restrizioni?

P.S. Sto leggendo C ++ 03 versione della norma.

È stato utile?

Soluzione

I pensare che la distinzione è importante perché entrambi non rientrano nella stessa categoria di conversione e hanno diversi rango (vedi 13.3.3.1 .1, sequenze di conversione standard). Il rango fa la differenza quando si tratta di risoluzione di sovraccarico:

  

sequenze di conversione standard sono ordinate per loro ranghi: una corrispondenza esatta è una conversione di meglio di una promozione,   che è una conversione di meglio di una conversione.

Alla fine, credo che sia la distinzione tra 4.5 e 4.7 che rende il seguente codice univoco:

#include <iostream>

void foo(int i)            { std::cout << "foo(int)" << std::endl; }
void foo(unsigned short i) { std::cout << "foo(unsigned short)" << std::endl; }

int main()
{
    foo(static_cast<short>(1));
}
  • short a int è una promozione (avendo così rango promozione)
  • short ad unsigned short è una conversione (avendo così rango conversione)

Alla fine, questo codice chiama foo(int) perché è un candidato migliore.

Altri suggerimenti

Promozioni verificano durante le operazioni aritmetiche e di altri. Conversioni avvengono quando semplicemente memorizzando un tipo integrale all'interno di un'altra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top