c++ - Por que remove_reference não funciona em funções?




templates types (2)

Bem-vindo ao mundo dos tipos de funções abomináveis.

void() & não é uma referência a void() . A maneira de soletrar que seria void(&)() (que, se você remove_reference_t , retornaria void() - ou seja, remove_reference_t funciona nas referências a funções, se o que você fornecer for realmente uma referência ao tipo de função )

O que void() & realmente se refere é o tipo de uma função membro qualificada para referência depois que você tira a classe. Isso é:

struct C {
    void f() &;
};

O tipo de &C::f é void (C::*)() & . Mas todos os ponteiros para membros podem ser escritos como TC::* para algum tipo T e, nesse caso, o tipo T seria void() & .

Veja também P0172 .

Ocorreu algo estranho ao fazer algum modelo de metaprogramação no outro dia. Basicamente, tudo se resume a essa afirmação que não (como eu esperaria) passar.

static_assert(std::is_same_v<void(), std::remove_reference_t<void()&>>);

No começo, pensei que estava cometendo um erro sintático ao definir uma referência de função, mas essa afirmação passa, mostrando que esse não é o caso.

static_assert(std::is_same_v<void()&, void()&>);

Também tentei implementar o remove_reference copiando a fonte do cppreference, mas isso também não funcionou. O que está acontecendo aqui?


O tipo que você possui não é uma referência a uma função, mas uma função com um qualificador de referência .

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






c++17