使用时std::bind
要绑定成员函数,第一个参数是对象this
指针。然而,它可以将对象作为指针传递,也可以不传递。
例如,请参见以下程序:
#include <iostream>
#include <functional>
struct foo
{
void bar(int v) { std::cout << "foo::bar - " << v << '\n'; }
};
int main()
{
foo my_foo;
auto f1 = std::bind(&foo::bar, my_foo, 1);
auto f2 = std::bind(&foo::bar, &my_foo, 2);
f1();
f2();
}
clang 和 GCC 都毫无怨言地编译了这个,并且结果适用于两种绑定:
foo::bar - 1
foo::bar - 2
我一直在努力理解规范(第 20.8.9 节),但这是我不太清楚的地方之一。
应该只有一个是正确的,还是两者都正确?
两者都是正确的。 20.8.9.1.2 转向 20.8.2 描述要求和调用的效果bind
。 20.8.2 是:
20.8.2 要求 [func.require]
1 Define INVOKE(f, t1, t2, ..., tN)
as follows:
— (t1.*f)(t2, ..., tN)
when f
是一个指向类的成员函数的指针T
and t1
是一个类型的对象T
或对类型对象的引用T
或对派生类型的对象的引用T
;
— ((*t1).*f)(t2, ..., tN)
when f
是一个指向类的成员函数的指针T
and t1
不是上一项中描述的类型之一;
— t1.*f
when N == 1
and f
是指向类的成员数据的指针T
and t1
是一个类型的对象T
或对类型对象的引用T
或对派生类型的对象的引用T
;
— (*t1).*f
when N == 1
and f
是指向类的成员数据的指针T
and t1
不是上一项中描述的类型之一;
— f(t1, t2, ..., tN)
在所有其他情况下。
前两个选项允许引用和指针。
这里需要注意的重要一点是,措辞确实not将您限制为普通指针。你可以使用std::shared_ptr
或其他一些智能指针,使您的实例在绑定时保持活动状态,并且它仍然可以使用std::bind
as t1
被取消引用,无论它是什么(当然,这是可能的)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)