2016-09-18 23 views
5
int main() 
{ 
const int a = 1; 
const int b = 2; 
typedef decltype(a*b) multiply_type; 
cout << typeid(multiply_type).name() << endl; 
return 0; 
} 

Wartość zwracana przez program polega na tym, że multiply_type is int. Jestem całkiem zaskoczony. Spodziewałem się, że dedukcja typu da wartość const int, a ponieważ wyrażenie daje wartość pr, wynikowy typ byłby stały.Wyjaśnienie wyjściowych danych wyjściowych po pomnożeniu 2 stałych wartości stałych

PS: W przypadku auto wartość zwracana byłaby int, ponieważ opuszcza kwalifikator const.

Jakieś pomysły, dlaczego typ_wielolicy ma wartość int, a nie const int z decltype?

Edycja: Dodano przykład dodawania, który jest również powiązany z kwalifikatorem cv.

#include<iostream> 
#include<typeinfo> 


using namespace std; 

struct Details 
{ 
    int m_age; 
}; 

int main() 
{ 
const Details* detail = new Details(); 
typedef decltype((detail->m_age)) age_type; 
cout << typeid(age_type).name() << endl; 

int a = 1; 
age_type age = a; 
age = 10; // This is not possible. Read only. 
cout << typeid(age).name() << endl; // This returns the type as int though. Then why is 20 not possble ? 
return 0; 

} 

Edytuj 2: Sprawdź nasz link. http://thbecker.net/articles/auto_and_decltype/section_07.html `

int x; 
const int& crx = x; 
/The type of (cx) is const int. Since (cx) is an lvalue, 
// decltype adds a reference to that: cx_with_parens_type 
// is const int&. 
typedef decltype((cx)) cx_with_parens_type;` 
+6

Kategorie wartości i kwalifikatory cv są niezależne. W twoim konkretnym przypadku ma zastosowanie [wyrażenie]/6; nie ma żadnych wartości pradawnych typu "const" skalarnego. – Columbo

+0

Zobacz moją edycję. Chciałem powiedzieć, że wyrażenie jest pr-wartością. – KodeWarrior

+2

Nie mam pojęcia, jak to jest związane z moją odpowiedzią. – Columbo

Odpowiedz

1

decltype ocenić to argument, jak to jest, decltype(i) gdzie i jest cv wykwalifikowany lwartość skutkuje deklarując typ cv wykwalifikowany, ale wyrazem i*i w decltype(i*i) stworzyć non zmaterializował prvalue z typem i z non cv-kwalifikowany, prvalue nie mają wyraźnego pojęcia constness. Twój kod produkować takie same, jak:

using T = const int; 
static_assert(is_same<int, decltype(0)>(), "Failed"); 

Fakt typeid nie pokazując CV kwalifikacje dlatego one ignorowane:

5.2.8.5 - Jeśli typ wyrażenia lub typ-id jest Typ kwalifikowany cv, wynik wyrażenia typu "id" odnosi się do obiektu std :: typ_info reprezentującego typ bez cv.

Powiązane problemy