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, yb) si la categoría de valor de la expresión es lvalue, entonces
decltypeproduceT&;
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::threadsolo 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;
^