Som*_*ude 62 c++ language-lawyer c++11
当使用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();
}
Run Code Online (Sandbox Code Playgroud)
clang和GCC都没有投诉地编译它,结果适用于两个绑定:
foo::bar - 1 foo::bar - 2
我一直试图围绕规范(第20.8.9节),但它是我不太清楚的地方之一.
应该只有一个是正确的,还是都是正确的?
Dan*_*rey 49
两者都是正确的.20.8.9.1.2转发到20.8.2来描述要求和你的电话效果bind.20.8.2是:
20.8.2要求[func.require]
1定义INVOKE
(f, t1, t2, ..., tN)如下:-
(t1.*f)(t2, ..., tN)whenf是指向类的成员函数的指针T,t1是类型T的对象T或对类型对象的引用或对派生类型的对象的引用T;-
((*t1).*f)(t2, ..., tN)whenf是指向类的成员函数的指针,T并且t1不是上一项中描述的类型之一;-
t1.*fwhenN == 1和f是指向类的成员数据的指针T,t1是类型T的对象T或对类型对象的引用或对派生类型的对象的引用T;-
(*t1).*fwhenN == 1和f是指向类成员数据的指针,T并且t1不是前一项中描述的类型之一;-
f(t1, t2, ..., tN)在所有其他情况下.
前两个选项允许引用和指针.
这里要注意的重要一点是,措辞也不会限制你普通指针.你可以使用一个std::shared_ptr或一些其他的智能指针,让您的实例还活着,而绑定的,它仍然会工作,std::bind为t1解除引用,不管它是什么(因为,当然,这是可能的).