为什么 C++11 标准中的 INVOKE 设施是指数据成员?

Why does INVOKE facility in the C++11 standard refer to data members?

本文关键字:数据成员 设施 INVOKE C++11 标准 为什么      更新时间:2023-10-16

$ 20.8.2 描述了 INVOKE 工具,该工具主要用于描述如何使用标准库中的可变参数列表调用可调用对象:

定义 INVOKE (f, t1, t2, ..., tN),如下所示:

(t1.*f)(t2, ..., tN)当 f 是指向类 T 的成员函数的指针并且 t1 是 类型 T 或对 T 类型对象的引用或对派生自 T 的类型对象的引用;

((*t1).*f)(t2, ..., tN)当 f 是指向类 T 的成员函数的指针并且 t1 不是 上一项中描述的类型;

t1.*f当 N == 1 且 f 是指向类 T 的成员数据的指针且 t1 是类型 T 或 引用 T 类型的对象或引用派生自 T 的类型的对象;

(*t1).*f当 N == 1 且 f 是指向类 T 的成员数据的指针并且 t1 不是类型之一时 在上一项中描述;

f(t1, t2, ..., tN)在所有其他情况下。

第三项和第四项是干什么用的?据我所知,即使f是可调用的,他们也不会打电话给f。他们的用户案例是什么。也许这是标准中的错别字,*f()是有意的?

INVOKE是这样指定的,因为您实际上可以绑定成员数据指针(通过bindmem_fn):

§20.8.10 [func.memfn]

template<class R, class T>
unspecifiedmem_fn(R T::* pm);

p1返回:一个简单的调用包装器 (20.8.1)fn,表达式fn(t, a2, ..., aN)等效于INVOKE(pm, t, a2, ..., aN)(20.8.2)。fn应具有嵌套类型result_type当返回类型pm是指向成员函数的指针时,该类型是返回类型pm的同义词。

如果您无法绑定成员数据指针,我认为不会存在特殊措辞。

#include <functional>
#include <iostream>
struct X{
int n = 5;
};
int main(){
X x;
auto f = std::mem_fn(&X::n);
std::cout << f(&x) << "n";
}

输出:5

活生生的例子。