2015-03-05 15 views
8

W C++ 11 jakie są typy x i y kiedy to piszę?Jaki jest typ "auto var = {warunek}? 1: 1.0" w C++ 11? Czy to podwójne czy 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

'szablon struct typeof; szablon struct typeof >;' – 0x499602D2

+0

Można użyć [typeid] (http://coliru.stacked-crooked.com/a/a4158dbd29785207) za to (również ja think boost ma swoją własną podobną do siebie rzecz) – Borgleader

+0

Jest to popularny typ 'int' i' double', więc 'double'. – chris

Odpowiedz

9

typ będzie double, bo to common type z literałów 1 i 1.0.

Jest to prosty sposób na sprawdzenie, że za pomocą typeid:

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

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

ten wyprowadza d na mojej wersji GCC. Uruchamianie echo d | c++filt -t następnie mówi nam, że d odpowiada typowi double, zgodnie z oczekiwaniami.

+2

[Kolejny przydatny zasób C++] (http: //en.cppreference.com/w/cpp/types/common_type) roszczenia 'typ_typowy', które należy zdefiniować w kategoriach tego, co'? : 'operator produkuje. –

5

Według opisu operatora warunkowego C++ Standard (5,16 Operator warunkowy)

6 lwartości do RValue (4,1) Tablica do wskaźnika (4.2), a funk- to-pointer (4.3) standardowe konwersje są wykonywane na drugim i trzecim operandzie . Po tych przekształceniach jeden z następujących elementów będzie miał:

- Drugi i trzeci operand mają typ arytmetyczny lub wyliczeniowy; Typowe konwersje arytmetyczne są wykonywane w celu dostosowania ich do wspólnego typu, a wynik jest tego rodzaju.

A (5 Expressions)

10 Wielu operatorów binarnych, które oczekują operandów arytmetycznych lub typu wyliczenie konwersji przyczyny i rodzaje wynikowych wydajność w podobny sposób. Celem jest uzyskanie wspólnego typu, który jest również typem rezultatu . Wzór ten jest nazywany zwykle arytmetyczne konwersji , które są zdefiniowane w następujący sposób:

- w przeciwnym razie jeżeli jeden operand podwójne, inne przelicza dwukrotnie.

W obu zastosowań operatora warunkowej operandów jest przestawne dosłownego mający typu podwójnego - 1.0 (C++ standardowa: Typ pływający dosłownym jest dwukrotnie o ile wyraźnie nie podano przyrostkiem.)

Tak więc drugi operand również zostanie przekonwertowany na typ double, a wynik wyrażeń ma typ double.