una que programacion orientada objetos objeto miembros metodos ejemplos clases clase atributos c++ reference const c++14 decltype

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&&!

ejemplo en vivo

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.