p12*_*p12 6 c++ standards c++11
该标准的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()是有意的吗?
Xeo*_*Xeo 10
INVOKE是这样指定的,因为你可以实际绑定成员数据指针(通过bind和mem_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,它是pmwhenpm指向成员函数的指针的返回类型的同义词.
如果您无法绑定成员数据指针,我认为不存在特殊措辞.
#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";
}
Run Code Online (Sandbox Code Playgroud)
输出:5