std :: is_function如何实现?


82

以下是如何实现的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在此定义下,an 将是一个函数。我想念什么?


10
考虑一下这个!is_const部分。
aschepler

为什么函数类型不能为const?这与可恶的类型有关吗?
jtbandes

4
@jtbandes是因为函数是C ++中不是对象的少数事物之一。
Ayxan

1
我猜是因为从某种意义上说,它始终是常量
RiaD

我觉得标题有误导性。“这如何有效地实现std :: is_function?” 似乎更合适。
瓦尔说莫妮卡

Answers:


73

让我们仔细研究一下出现的条件:
如果const 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合格的函数类型。—尾注] [...]


5
啊...。我在此is_const部分中缺少“ const”。这就说得通了。
瑞安·奎因

54

语言中只有两种类型不能具有const限定符:引用类型和函数类型。因此,如果const T不能为const限定类型,则意味着T是函数类型或引用类型。如果可以排除引用类型,则仅剩下函数类型。

请注意,带有cv限定符的函数类型(例如int(int) const不是 const限定类型。这是“令人讨厌的函数类型”的一个示例,其唯一真正的用途是组成或分解成员函数指针类型。int(int) const无法通过在顶部添加const-qualification获得类型int(int)。相反,const应用于隐含对象参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.