为什么 C++11 标准中的 INVOKE 设施是指数据成员?
Why does INVOKE facility in the C++11 standard refer to data members?
$ 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
是这样指定的,因为您实际上可以绑定成员数据指针(通过bind
和mem_fn
):
§20.8.10 [func.memfn]
template<class R, class T>
unspecified
mem_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
活生生的例子。
- 用于访问容器<T>数据成员的正确 API
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 数据成员SFINAE的C++17测试:gcc vs clang
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 如何在c++中定义以struct为数据成员的类中的构造函数
- 静态数据成员模板专用化的实例化点在哪里
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用指针访问数组中的对象数据成员
- 友元函数无法访问私有数据成员 (c++)
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- 将私有数据成员添加到野牛生成的类中
- 输入数据成员未按要求工作
- 二维矢量数据成员
- 在类 A 中创建类型为 B 类的向量 - 访问数据 [C++] [成员在两个类中都是私有的]
- 调用在 HXX 文件中声明的静态数据成员
- 是否可以根据其数据成员的类型确定类型的大小
- 访问数据成员(本身是对象)的数据成员,就好像它们是类成员一样
- 使公共数据成员在C++中无法访问
- 从 XML 中读取未指定结构的每个数据成员