【问题标题】:How is std::is_function implemented?std::is_function 是如何实现的?
【发布时间】:2020-04-26 11:57:46
【问题描述】:

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 Reference

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

【问题讨论】:

  • 想想!is_const 部分。
  • 为什么函数类型不能是 const?这和可恶的类型有关吗?
  • @jtbandes 这是因为函数是 C++ 中少数不是对象的东西之一。
  • 我猜是因为在某种意义上它总是 const
  • 我觉得标题具有误导性。 “这是一个有效的 std::is_function 实现吗?”似乎更合适。

标签: c++ templates std sfinae


【解决方案1】:

让我们回顾一下出现的条件:
如果 const T 不是 const (const 并不真正适用于函数类型,因为函数不是对象),并且 T 不是引用(const 也不适用于引用同样的原因),它是一个函数类型。 int(或任何其他非函数非引用类型)不适合,因为is_const&lt;const int&gt;::valuetrue

根据C++17 Standard §11.3.5 Functions / section 7:(强调我的)

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

【讨论】:

  • 啊....我错过了 is_const 部分中的“const”。这是有道理的。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2010-11-30
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多