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 int
seria uma função sob esta definição. o que estou perdendo?
!is_const
parte.Respostas:
Vamos examinar as condições conforme elas aparecem:
Se
const T
não é const (const
não se aplica realmente a tipos de funções, pois funções não são objetos) eT
não é uma referência (const
nã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 porqueis_const<const int>::value
étrue
.De acordo com o C ++ 17 Standard §11.3.5 Funções / seção 7 : (ênfase minha)
fonte
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 T
não for um tipo qualificado de const, significa queT
é 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 tipoint(int) const
não pode ser obtido adicionando const-qualification em cima deint(int)
. Em vez disso,const
aplica-se ao parâmetro de objeto implícito.fonte