Appena posta una domanda simile che si riduce a questa.Perché le variabili membro di un oggetto const non sono 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;
}
Perché i modelli non diventano const int
invece di int
?
Quindi 'decltype' ** sempre ** restituisce solo il tipo di dichiarazione del nome come definito nel codice? Ignorando 'const'ness,' ref'ness o 'volatile'ness di tutti gli oggetti presi per arrivarci? per esempio una variabile all'interno di un oggetto 'const'? – Curious
@Curious Per il caso specifico in cui l'operando è solo il nome di una variabile o un'espressione di accesso membro, sì, fornisce il tipo di dichiarazione. La qualifica cv dell'oggetto racchiuso modifica il tipo dell'espressione, ma si ottiene il tipo di espressione solo se si utilizzano parentesi aggiuntive. Una cosa simile vale per la categoria di valore. – Brian