使用std :: bind和成员函数,对这个参数使用对象指针与否?

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)when f是指向类的成员函数的指针T,t1是类型T的对象T或对类型对象的引用或对派生类型的对象的引用T;

- ((*t1).*f)(t2, ..., tN)when f是指向类的成员函数的指针,T并且t1不是上一项中描述的类型之一;

- t1.*fwhen N == 1f是指向类的成员数据的指针T,t1是类型T的对象T或对类型对象的引用或对派生类型的对象的引用T;

- (*t1).*fwhen N == 1f是指向类成员数据的指针,T并且t1不是前一项中描述的类型之一;

- f(t1, t2, ..., tN)在所有其他情况下.

前两个选项允许引用和指针.

这里要注意的重要一点是,措辞也不会限制你普通指针.你可以使用一个std::shared_ptr或一些其他的智能指针,让您的实例还活着,而绑定的,它仍然会工作,std::bindt1解除引用,不管它是什么(因为,当然,这是可能的).