Ich habe nur eine ähnliche Frage gestellt, die auf dieses Problem hinausläuft.Warum Elementvariablen eines const Objekts nicht const sind
#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;
}
Warum die Vorlagen werden nicht const int
statt int
?
Also 'declltype' ** immer ** gibt nur den Typ der Deklaration des Namens zurück, wie im Code definiert? Ignorieren Sie die 'const'ness,' ref'ness oder 'volatile'ness aller Objekte, die dorthin gebracht wurden? zum Beispiel eine Variable innerhalb eines 'const' Objekts? – Curious
@Curious Für den speziellen Fall, dass der Operand nur der Name einer Variablen oder eines Mitgliedszugriffsausdrucks ist, gibt yes den Typ der Deklaration an. Die cv-Qualifizierung des einschließenden Objekts ändert den Typ des Ausdrucks, aber Sie erhalten nur den Typ des Ausdrucks, wenn Sie zusätzliche Klammern verwenden. Ähnliches gilt für die Wertkategorie. – Brian