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;`
値のカテゴリとcv修飾子は独立したものです。あなたの特別の場合、[expr]/6が適用されます。 'const'スカラ型のprvalはありません。 – Columbo
私の編集を参照してください。私は表現がpr値であると言っていました。 – KodeWarrior
私はそれが私の答えにどのように関係しているのか分かりません。 – Columbo