c++ templates types c++17

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(&)()>>);