以下如何实现std::is_function
?
template<class T>
struct is_function : std::integral_constant<
bool,
!std::is_const<const T>::value && !std::is_reference<T>::value
> {};
(来自CPP参考(
在我看来,int
将是这个定义下的一个函数。我错过了什么?
让我们回顾一下出现的条件:
如果const T
不是 const (const
并不真正适用于函数类型,因为函数不是对象(,并且T
不是引用(const
出于同样的原因也不适用于引用(,它是一个函数类型。int
(或任何其他非函数非引用类型(不适合is_const<const int>::value
因为true
。
根据 C++17 标准 §11.3.5 功能/第 7 节:(强调我的(
函数声明符中 cv-qualifier-seq 的效果不是 与在函数类型之上添加 CV 资格相同。在 后一种情况,将忽略 CV 限定符。[ 注意:函数类型 具有 CV 限定符序列的不是符合 CV 条件的类型;没有 符合 CV 标准的函数类型。— 尾注 ] [...]
语言中只有两类类型不能具有 const 限定:引用类型和函数类型。因此,如果const T
不是常量限定类型,则意味着T
是函数类型或引用类型。如果可以排除引用类型,则只剩下函数类型。
请注意,带有 cv 限定符的函数类型(如int(int) const
(不是常量限定类型。这是一个"可恶的函数类型"的示例,其唯一真正的用途是组合或分解指向成员函数类型的指针。类型int(int) const
不能通过在int(int)
之上添加常量限定来获得。相反,const
适用于隐含对象参数。