Como o std :: is_function é implementado?

82

Como é a implementação a seguir std::is_function?

template<class T>
struct is_function : std::integral_constant<
    bool,
    !std::is_const<const T>::value && !std::is_reference<T>::value
> {};

(da referência CPP )

Parece-me que uma intseria uma função sob esta definição. o que estou perdendo?

Rian Quinn
fonte
10
Pense sobre a !is_constparte.
aschepler
Por que os tipos de função não podem ser const? Isso está relacionado a tipos abomináveis?
jtbandes 8/01
4
@ jtbandes é porque as funções são uma das poucas coisas em C ++ que não são objetos.
Ayxan 8/01
11
Eu acho que porque, em certo sentido, é sempre const
RiaD 09/01
Eu sinto que o título é enganoso. "Como esta é uma implementação std :: is_function válida?" parece mais apropriado.
val diz Reintegrar Monica

Respostas:

73

Vamos examinar as condições conforme elas aparecem:
Se const Tnão é const ( constnão se aplica realmente a tipos de funções, pois funções não são objetos) e Tnão é uma referência ( constnão se aplica a referências pelo mesmo motivo) , é um tipo de função. int(ou qualquer outro tipo de não-função-não-referência) não se encaixaria porque is_const<const int>::valueé true.

De acordo com o C ++ 17 Standard §11.3.5 Funções / seção 7 : (ênfase minha)

O efeito de um cv-qualifier-seq em um declarador de função não é o mesmo que adicionar a qualificação cv sobre o tipo de função. No último caso, os qualificadores de cv são ignorados. [Nota: Um tipo de função que possui um cv-qualifier-seq não é um tipo qualificado para cv; não há tipos de função qualificados para CV. - nota final] [...]

Ayxan
fonte
5
Ah .... estava faltando o "const" dentro da parte is_const disso. Isso faz sentido.
Rian Quinn
54

Existem apenas duas categorias de tipos no idioma que não podem ter qualificação constante: tipos de referência e tipos de função. Portanto, se const Tnão for um tipo qualificado de const, significa que Té um tipo de função ou um tipo de referência. Se você pode descartar tipos de referência, restam apenas os tipos de função.

Observe que um tipo de função que carrega um qualificador de cv, como int(int) const, não é um tipo qualificado de const. É um exemplo de um "tipo de função abominável", cujo único uso real é compor ou decompor tipos de função de ponteiro para membro. O tipo int(int) constnão pode ser obtido adicionando const-qualification em cima de int(int). Em vez disso, constaplica-se ao parâmetro de objeto implícito.

Brian
fonte