在 C++ 中,我们如何使用执行函数的有效 X(Args...) 语法调用所有内容?

In C++ how do we call everything with a valid X(Args...) syntax that execute a function?

在 C++ 中,有一个 Callable 概念以及 std::is_function 类型特征。我想知道标准如何调用 X,当确切的表达式

X(Args...)

有效并对应一个调用(不包括构造函数和 C 宏)。现在,我可以想到以下适合该类别的内容:

我的问题:

  1. 标准如何调用X? (例如:不是 is_function 类型,因为如果 X 是函数指针,则 X(Args...) 有效但 is_function 为假)
  2. 我是不是忘记了什么东西在我的列表中?

你的问题好像有点糊涂。 std::is_function 仅标识 actual function types. It doesn't even include pointers to functions. The FunctionObject concept 包括您可以应用函数调用运算符的任何对象类型。这基本上涵盖了您的列表。

Callable concept包括函数对象,但它还包括其他东西。 Callable 将成员指针(数据和函数)添加到 FunctionObject 系列的其余部分。

C++ 的 INVOKE 特性适用于所有 Callable 对象。 INVOKE 实际上不是 C++ 中的函数;它只是使用参数列表调用 Callable 对象的算法的标准名称(C++17 纠正了这种荒谬的监督,给了我们 std::invoke)。该标准的第 20.9.2 节详细介绍了该算法的实现方式。

总的要点就是您所期望的。如果可调用对象是指向成员数据的指针,那么您采用第一个参数,并将其应用于指向成员数据的指针(如果它不是指针,则取消引用该参数)。指向成员函数的指针也是如此,只是您将其余参数作为参数传递。

对于 FunctionObject 类型,您只需使用 () 调用它,将参数传递给它。