带有调用运算符的std :: bind on member

mor*_*nvp 3 c++ c++11

这可能是一个愚蠢和愚蠢的事情 - 但我想了解这里发生了什么.

我有以下代码:

#include <iostream>
#include <functional>

namespace
{
    struct call
    {
        void operator()() const
        {
            std::cout << "call::operator()" << std::endl;
        }
    };

    struct dummy
    {
        dummy() = default;
        dummy(const dummy&) = delete;

        call member;
    }; 
}
Run Code Online (Sandbox Code Playgroud)

因此,member本质上可以像任何其他对象方法一样工作,允许它被调用为:

dummy d;
d.member()
Run Code Online (Sandbox Code Playgroud)

哪个会打印call::operator().

现在我想使用bind来做到这一点,初始实现看起来像这样:

int main() 
{
    dummy d;

    auto b = std::bind(&dummy::member, &d);
    b();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译,但没有打印.我真的不明白发生了什么 - 它编译的事实,但产生没有输出困惑我:)当然一些魔法正在肚子里面std::bind,但是什么?

以下是使用代码的链接:https: //ideone.com/P81PND

Jar*_*d42 6

目前,您的绑定返回一个成员,所以b()d.member.您必须在上面调用operator():

b()(); // call::operator()
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用以下任何一种:

b = std::bind(&call::operator(), &d.member);
b = [&]() {d.member();};
Run Code Online (Sandbox Code Playgroud)