c++ - ¿Por qué remove_reference no funciona en las funciones?
templates types (2)
Bienvenido al mundo de los tipos de funciones abominables.
void() &
no
es una referencia a
void()
.
La forma de deletrear eso sería
void(&)()
(que si
remove_reference_t
, obtendría
void()
, es decir
remove_reference_t
funciona en referencias a funciones, si lo que proporciona es en realidad una referencia al tipo de función )
A lo que
void() &
realmente se refiere es al tipo de función miembro calificada como referencia después de que eliminas la clase.
Es decir:
struct C {
void f() &;
};
El tipo de
&C::f
es
void (C::*)() &
.
Pero todos los punteros a los miembros pueden escribirse como
TC::*
para algún tipo
T
, y en este caso el tipo
T
sería
void() &
.
Ver también P0172 .
Me encontré con algo extraño al hacer una metaprogramación de plantilla el otro día. Básicamente se trata de esta afirmación, no (como era de esperar) pasar.
static_assert(std::is_same_v<void(), std::remove_reference_t<void()&>>);
Al principio pensé que estaba cometiendo un error sintáctico al definir una referencia de función, pero esta afirmación pasa, mostrando que ese no es el caso.
static_assert(std::is_same_v<void()&, void()&>);
También intenté implementar
remove_reference
copiando la fuente de cppreference pero tampoco funcionó.
¿Que esta pasando aqui?
El tipo que tiene no es una referencia a una función, sino una función con un calificador de referencia .
static_assert(std::is_same_v<void()&, void()&>);
static_assert(!std::is_same_v<void()&, void(&)()>);
static_assert(std::is_same_v<void(&)(), void(&)()>);
static_assert(std::is_same_v<void(), std::remove_reference_t<void(&)()>>);