6

标准的 $ 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()是有意的?

4

1 回答 1

10

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应该有一个嵌套类型,它是when是指向成员函数的指针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

活生生的例子。

于 2012-09-28T10:59:33.837 回答