2016-09-18 3 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; 
} 

プログラムの戻り値は、multiply_typeがintです。私はかなり驚いています。私はconst intを得るために型減算を期待していました。表現がpr値を生成するので、結果の型はconst intになります。2つのconst intを掛け合わせるときのdeclypeの出力の明確化

PS:自動では、戻り値はconst修飾子を削除するのでintになります。

なぜmultiply_typeがconst型ではなくint型で、decltype型であるのですか?

編集:cv-qualifierにも関連する追加例を追加しました。

#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; 

} 

編集2:リンクを確認してください。 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

値のカテゴリとcv修飾子は独立したものです。あなたの特別の場合、[expr]/6が適用されます。 'const'スカラ型のprvalはありません。 – Columbo

+0

私の編集を参照してください。私は表現がpr値であると言っていました。 – KodeWarrior

+2

私はそれが私の答えにどのように関係しているのか分かりません。 – Columbo

答えて

1

decltypeそのまま引数、decltype(i)iは、タイプCV-資格を宣言におけるCV-資格左辺値、結果ですが、decltype(i*i)i*iの発現が非を作成する場所、それを評価prvalueをマテリアiのタイプがcv-qualifiedの場合、prvalueにはconstの明示的な概念はありません。 - 式またはタイプ-IDのタイプがある場合

5.2.8.5

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

彼らは無視するのでtypeidは、CV-資格をされて表示されていないという事実を:あなたのコードは、同じに生産しますcv修飾型である場合、typeid式の結果は、cv非修飾型を表すstd :: type_infoオブジェクトを参照します。

関連する問題