std::is_function 是如何实现的?

Ria*_*inn 88 c++ templates std sfinae

以下是如何实现的std::is_function

template<class T>
struct is_function : std::integral_constant<
    bool,
    !std::is_const<const T>::value && !std::is_reference<T>::value
> {};
Run Code Online (Sandbox Code Playgroud)

(来自CPP 参考

在我看来, anint将是此定义下的函数。我错过了什么?

Ayx*_*xan 78

让我们回顾一下出现的条件:
Ifconst T不是 const (const实际上不适用于函数类型,因为函数不是对象),并且T不是引用(const出于同样的原因,也不适用于引用) ,它是一个函数类型。int(或任何其他非函数非引用类型)不适合,因为is_const<const int>::valueis true

根据C++17 标准 §11.3.5 函数/第 7 节:(重点是我的)

函数声明器中 cv-qualifier-seq 的效果与在函数类型之上添加 cv-qualification 不同。在后一种情况下,忽略 cv 限定符。[ 注意:具有 cv-qualifier-seq 的函数类型不是 cv 限定类型;没有 cv 限定的函数类型。- 尾注] [...]

  • 啊....我错过了 is_const 部分中的“const”。这就说得通了。 (6认同)

Bri*_*ian 58

语言中只有两类类型不能具有 const 限定:引用类型和函数类型。因此,如果const T不能是 const 限定类型,则意味着T要么是函数类型,要么是引用类型。如果您可以排除引用类型,那么您将只剩下函数类型。

请注意,带有 cv 限定符的函数类型(例如int(int) const不是const 限定类型。这是一个“可恶的函数类型”的例子,它唯一的真正用途是组合或分解指向成员函数的指针类型。类型int(int) const不能由上的顶部添加常量资格来获得int(int)。相反,const应用于隐含的对象参数。