ちょうどこれに似た質問があります。なぜconstオブジェクトのメンバ変数がconstでないのです
#include <iostream>
using namespace std;
struct A {
A() : a{1} {};
int a;
};
template <typename Which>
struct WhichType;
int main() {
const A a;
const A& a_ref = a;
const A* a_ptr = &a;
WhichType<decltype(a.a)> which_obj; // template evaluates to int
WhichType<decltype(a_ref.a)> which_ref; // template evaluates to int
WhichType<decltype(a_ptr->a)> which_ptr; // template evaluates to int
return 0;
}
なぜテンプレートはconst int
の代わりint
にはならないのですか?
したがって、 'decltype' ** always **は、コードで定義されている名前の宣言の型だけを返しますか?そこに行くために取られたすべてのオブジェクトの 'const'ness、' ref'nessまたは 'volatile'nessを無視しますか?例えば 'const'オブジェクト内の変数? – Curious
@Curiousオペランドが変数またはメンバーアクセス式の名前だけである特定の場合、yesは宣言の型を示します。囲みオブジェクトのcv修飾により、式の型が変更されますが、余分なカッコを使用すると、式の型だけが取得されます。同様のことがバリューカテゴリに適用されます。 – Brian