c++ - que - Por qué las variables miembro de un objeto const no son const
que es un objeto en java (2)
Cuando pasa el nombre de un identificador (o miembro), devuelve el tipo de declaración.
Cuando pasa una expresión diferente, devuelve algo más cercano a lo que desea, pero calificado de referencia.
WhichType<std::remove_reference_t<decltype((a_ptr->a))>> which_ptr; // template evaluates to const int!
ejemplo en vivo o si quieres el valor l / r:
WhichType<decltype((a_ptr->a))> which_ptr2; // template evaluates to const int&
WhichType<decltype(((const A){}.a))> which_ptr3; // template evaluates to const int
puede agregar &&
para que sea una referencia de valor "real" aquí.
WhichType<decltype(((A){}.a))&&> which_ptr4; // template evaluates to int&&!
Acabo de hacer una pregunta similar que se reduce a esta.
#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;
}
¿Por qué las plantillas no se convierten en const int
lugar de int
?
decltype
le proporciona el "tipo declarado" del operando cuando no está encerrado en un conjunto adicional de paréntesis.
Para obtener el tipo real de la expresión, es decir, const int
, tendría que escribir decltype((aa))
y así sucesivamente.
decltype
siempre devuelve un tipo de referencia para las expresiones lvalue distintas de los nombres.