C++ 在C++;?

C++ 在C++;?,c++,lambda,c++17,functor,typetraits,C++,Lambda,C++17,Functor,Typetraits,我试图理解概念的层次结构和可以作为std::invoke的第一个参数传递的事物的类型 让我们考虑一个类型 f>代码>,这样至少存在一个组合: ARGs,这样 STD::ISSUnjokabLyV是代码> Trase 问题[1]:可以是什么类型的F 以下是暂定名单: 像std::function_v这样的函数是true 一种函数指针,使得std::function_v为true 一种函数引用,使得std::function_v为true 对函数指针的引用,使得std::function\u v为

我试图理解概念的层次结构和可以作为std::invoke的第一个参数传递的事物的类型

让我们考虑一个类型<代码> f>代码>,这样至少存在一个组合:<代码> ARGs<代码>,这样<代码> STD::ISSUnjokabLyV是代码> Trase

问题[1]:可以是什么类型的
F

以下是暂定名单:

  • std::function_v
    这样的函数是
    true
  • 一种函数指针,使得
    std::function_v
    true
  • 一种函数引用,使得
    std::function_v
    true
  • 对函数指针的引用,使得
    std::function\u v
    true
  • 指向成员函数的指针,使得
    std::is_member\u function\u pointer\u v
    is
    true
  • 对指向成员函数的指针的引用,例如
    std::is_member\u function\u pointer\u t
    is
    true
  • 指向成员对象的指针,使得
    std::is_member\u object\u pointer\u v
    true
  • 指向成员对象的指针的引用,这样
    std::is_member\u object\u pointer\u v
    is
    true
  • 一个类,使得
    std::is_class\u v
    true
    并且存在
    F::operator()
  • 对类的引用,使得
    std::is\u class\u v
    true
    ,并且存在
    std::remove\u reference\u t::operator()
  • 一个并集,使得
    std::is_union\u v
    true
    ,并且存在
    F::operator()
  • 对联合的引用,使得
    std::is\u union\u v
    true
    ,并且存在
    std::remove\u reference\u t::operator()
  • 闭包式
  • 对闭包类型的引用,使得
    std::remove\u reference\t
    是闭包类型
这个清单对吗?还有其他可行的选择吗

<强>问题[2 ]:封闭类型仅是lambda表达式的类型,还是C++中有其他方式创建被认为是闭包类型的东西?

问题[3]:标准有时会讨论函数对象:在问题1)的列表中,什么被视为函数对象

问题[4]:执行以下操作:

  • 闭包式
  • 一个类,使得
    std::is_class\u v
    true
    并且存在
    F::operator()
  • 一个并集,使得
    std::is_union\u v
    true
    ,并且存在
    F::operator()
是否属于标准中的特定概念(基本上是具有
运算符()
)的内容)?如果不是,那么对于一个类型特征来说,什么是一个好名字(例如,如果这样的东西在计算机科学或其他编程语言中有一个通用名称),它可以检测一个类型是否满足列出的要点之一

  • 函数类型的形式为
    R(Args…
    R(Args…)noexcept
    R(Args…)
    R(Args…)noexcept
  • (可能是cv限定的)指向#1的指针
  • (可能是cv限定的)至少有一个公共
    运算符()
    成员(包括继承的)的类类型
  • (可能是cv限定的)至少有一个公共非显式转换函数的类类型,a)对#1的引用,b)对#2的引用,或c)对#2的引用(包括继承的)
  • (可能是cv限定的)指向成员的指针
  • 参考上述内容
  • 对于#3、#4及其引用,还有一个额外的限定,即类型中编码的cv限定和值类别必须与至少一个这样的函数兼容

    是可以使用常用函数调用语法(即#2-#4)调用的对象类型。指向成员的指针不合格,因为您不能使用
    ()
    调用它们

    副定义是“函数对象类型或指向成员的指针”,即#2-#5


    函数类型和引用类型不是对象类型,因此既不是函数对象类型,也不是可调用类型,但可以通过应用
    std::decay

    而成为一种类型。我认为您遗漏了一系列与

    • 一个类,使得
      std::is_class\u v
      true
      ,并且使得F继承一个
      操作符()

    至于闭包和lambda,注意C++没有魔法lambda。Lambda只是类类型的对象,通过方便的语法创建

    std::bind
    还将生成一个
    可调用的
    对象,这也可以被视为一个闭包。但是,“闭包”是C++中没有确切含义的标签,不应该在列表中,如Nicol Bolas在注释中所指出的。

    我认为可调用的只是“任何<代码> x <代码>,使得<代码> x(某些参数)< /C> >是有效的“闭包类型”。因为闭包类型是按定义的类类型。即使
    std::is_class_v
    is
    false
    ,联合也被视为类类型吗?是。就核心语言而言,这两种类型都是类类型。你能在回答中澄清为什么5不是函数对象类型吗?你能解释一下为什么1和6不是可调用类型吗?另外,即使
    functor
    不是核心语言概念的一部分,你是否同意3(并且只有3)对应于传统的functor概念(在其他编程语言中可以看到)?“a)引用#1,b)#2,c)引用#2”读起来是一件非常尴尬的事情:-)+1。