2015-03-05 10 views
8

In C++ 11 quali sono i tipi di x e quando scrivo questo?Qual è il tipo di "auto var = {condizione}? 1: 1.0" in C++ 11? È doppio o int?

int main() 
{ 
    auto x = true ? 1 : 1.0; 
    auto y = false ? 1 : 1.0; 
    std::cout << x << endl; 
    std::cout << y << endl; 
    return 0; 
} 
+1

'modello struct typeof; template struct typeof >;' – 0x499602D2

+0

È possibile utilizzare [typeid] (http://coliru.stacked-crooked.com/a/a4158dbd29785207) per questo (anche io think boost ha la sua stessa cosa tipo idolo) – Borgleader

+0

È il tipo comune di 'int' e' double', quindi 'double'. – chris

risposta

9

Il tipo sta per essere double, perché è il common type dei letterali 1 e 1.0.

C'è un modo semplice per testare che l'utilizzo di typeid:

#include <iostream> 
#include <typeinfo> 
using namespace std; 

int main() { 
    auto x = true ? 1 : 1.0; 
    cout << typeid(x).name() << endl; 
    return 0; 
} 

Emette d sulla mia versione di GCC. In esecuzione echo d | c++filt -t ci dice che d corrisponde al tipo double, come previsto.

+2

[Un'altra utile risorsa C++ qui] (http: //en.cppreference.com/w/cpp/types/common_type) afferma 'common_type' da definire in termini di cosa' '? : 'operatore produce. –

5

Secondo la descrizione di operatore condizionale in Visual C++ (5.16 condizionale operatore)

6 Ivalue-to-rvalue (4.1), da matrice a pointer (4.2), e FUNCTION- to-pointer (4.3) le conversioni standard vengono eseguite sul secondo e terzo operando . Dopo tali conversioni, deve essere conservato uno dei seguenti valori:

- Il secondo e il terzo operando hanno un tipo aritmetico o di enumerazione; le normali conversioni aritmetiche vengono eseguite per portarle a un tipo comune e il risultato è di quel tipo.

E (5) espressioni

10 molti operatori binari che prevedono operandi di operazioni aritmetiche o tipo censimento causa conversioni e tipi di risultato resa in un modo simile . Lo scopo è quello di fornire un tipo comune, che è anche il tipo di il risultato. Questo modello è chiamato usuali conversioni aritmetiche, che sono definite come segue:

- Altrimenti, se uno degli operandi è doppia, l'altra è convertito raddoppiare.

Nelle entrambi gli usi dell'operatore condizionale uno degli operandi è fluttuante letterale avente tipo double - 1.0 (C++ standard: Il tipo di una letterale galleggiante è doppia se non espressamente specificato da un suffisso.)

auto x = true ? 1 : 1.0; 
auto y = false ? 1 : 1.0; 

Così l'altro operando anche saranno convertiti al tipo double e il risultato delle espressioni è di tipo double.