gpt4 book ai didi

c++ - C++ 中哪些类型被认为是可调用的?

转载 作者:行者123 更新时间:2023-11-30 02:20:38 27 4
gpt4 key购买 nike

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

让我们考虑一个类型 F这样至少存在一个 Args 的组合这样 std::is_invokable_v<F, Args...>true .

问题[1]:F有哪些类型?可以吗?

这是一个暂定列表:

  • 函数,例如 std::function_v<F>true
  • 一个函数指针使得std::function_v<std::remove_pointer_t<F>>true
  • 一个函数引用使得std::function_v<std::remove_reference_t<F>>true
  • 对函数指针的引用使得 std::function_v<std::remove_pointer_t<std::remove_reference_t<F>>>true
  • 指向成员函数的指针使得std::is_member_function_pointer_v<F>true
  • 对指向成员函数的指针的引用使得 std::is_member_function_pointer_t<std::remove_reference_t<F>>true
  • 一个指向成员对象的指针使得std::is_member_object_pointer_v<F>true
  • 对指向成员对象的指针的引用使得 std::is_member_object_pointer_v<std::remove_reference_t<F>>true
  • std::is_class_v<F>true这样 F::operator()存在
  • 一个类的引用使得std::is_class_v<std::remove_reference_t<F>>true这样 std::remove_reference_t<F>::operator()存在
  • 一个联盟使得std::is_union_v<F>true这样 F::operator()存在
  • 对 union 的引用使得 std::is_union_v<std::remove_reference_t<F>>true这样 std::remove_reference_t<F>::operator()存在
  • 闭包类型
  • 对闭包类型的引用使得 std::remove_reference_t<F>是闭包类型

这个列表是否正确?还有其他可行的选择吗?

问题 [2]:闭包类型只是 lambda 表达式的类型,还是在 C++ 中有其他方式创建可以被视为闭包类型的东西?

问题 [3]:标准有时会谈到函数对象:问题 1) 列表中的什么被视为函数对象?

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

  • 闭包类型
  • std::is_class_v<F>true这样 F::operator()存在
  • 一个联盟使得std::is_union_v<F>true这样 F::operator()存在

属于标准中的特定概念(基本上是具有 operator() 的东西)?如果不是,什么是类型特征的好名字(例如,如果这样的东西在计算机科学或其他编程语言中有一个通用名称),可以检测类型是否满足列出的要点之一?

最佳答案

  1. R(Args...) 形式的函数类型,R(Args...) noexceptR(Args..... .)R(Args ......) noexcept.
  2. (可能是 cv 限定的)指向 #1 的指针。
  3. (可能是 cv 限定的)至少有一个公共(public) operator() 成员(包括继承的)的类类型;
  4. (可能是 cv 限定的)至少有一个公共(public)非显式转换函数的类类型 a) 对 #1 的引用,b) #2,或 c) 对 #2 的引用(包括继承的);
  5. (可能是 cv 限定的)指向成员的指针。
  6. 引用上述内容。

对于#3、#4 及其引用,有一个额外的限定,即类型中编码的 cv 限定和值类别必须与至少一个这样的函数兼容。

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

A "callable type"根据定义是“函数对象类型或指向成员的指针”,即#2-#5。

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

关于c++ - C++ 中哪些类型被认为是可调用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49502876/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com