c++ c++11 const typetraits decltype

c++ - ¿Por qué std:: remove_const no elimina el calificador const?



c++11 typetraits (1)

Tenga en cuenta que uso std::thread solo para obtener tipos legibles en los errores:

int main() { const int * first; using deref = decltype(*first); std::thread s = std::remove_const<deref>::type{}; // const int ??? std::thread s2 = deref{}; // const int std::thread s3 = std::remove_const<const int>::type{}; // int }

Parece como si remove_const<deref>::type sea const int , no mutable int como es de esperar.


Tenga en cuenta que *first es una expresión lvalue, luego el tipo de resultado de decltype(*first) sería const int& , es decir, una referencia a const int . La referencia no es const sí misma (no puede ser constantada, no hay tal cosa como int& const ), usar std::remove_const en ella dará el mismo tipo, es decir, const int& .

Ver especificador decltype :

3) Si el argumento es cualquier otra expresión de tipo T , y

b) si la categoría de valor de la expresión es lvalue, entonces decltype produce T& ;

Puede usar std::remove_const con std::remove_reference juntos:

std::remove_const<std::remove_reference<deref>::type>::type // -> int ~~~~~ // -> const int & ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // -> const int

Por cierto:

Tenga en cuenta que uso std::thread solo para obtener tipos legibles en los errores:

Tenga en cuenta que no da el tipo correcto para este caso. Aquí hay un ayudante de plantilla de clase para este Efectivo C ++ moderno (Scott Meyers) :

template<typename T> class TD;

y usarlo como

TD<deref> td;

Recibirá el mensaje de error que contiene el tipo de deref , por ejemplo, de clang :

prog.cc:16:11: error: implicit instantiation of undefined template ''TD<const int &>'' TD<deref> td; ^