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
decltype
produceT&
;
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;
^