为什么当lambda工作时bind什么也不做?

Why bind does nothing while lambda works

本文关键字:什么 bind lambda 工作 为什么      更新时间:2023-10-16

我之前问过这个问题。我还有一个问题。下面是代码:

using namespace std::placeholders;
using namespace std;
struct MyType {};
struct MyType2 {};
ostream& operator<<(ostream &os, const MyType &n)
{
    cout << "MyType" << endl;
    return os;
}
ostream& operator<<(ostream &os, const MyType2 &n)
{
    cout << "MyType2" << endl;
    return os;
}
int main()
{
    std::vector<MyType> vec;
    MyType mt;
    vec.push_back(mt);
    std::for_each(vec.begin(), vec.end(), [](const MyType &mt) {cout << mt;});  // this works
    std::for_each(vec.begin(), vec.end(), std::bind((ostream&(ostream&, const MyType&))::operator<<, std::ref(std::cout), _1));  // this does nothing !
    return 0;
}

你明白为什么lambda工作而bind实现什么都不做了吗?它编译,但不做任何事情。

强制转换无效,需要强制转换为引用

static_cast<ostream&(&)(ostream&, const MyType&)>(::operator<<)

或指向指针

static_cast<ostream&(*)(ostream&, const MyType&)>(&::operator<<)

两者都将与std::bind一起工作。

<<p> 生活例子/strong>

请注意,您的原始代码被Coliru的GCC 4.8拒绝。

你的代码不能在gcc-4.8上编译,它抱怨对函数类型的强制转换无效。Clang确实编译了代码,但什么也不做,不确定那里发生了什么。无论如何,必须转换为函数指针类型,而不是函数类型。

std::for_each(vec.begin(), vec.end(), std::bind((ostream&(*)(ostream&, const MyType&))::operator<<, std::ref(std::cout), _1));
//                                                       ^^^

或者更好,丢掉c风格的强制转换,用static_cast代替

std::for_each(vec.begin(), vec.end(), 
              std::bind(static_cast<ostream&(*)(ostream&, const MyType&)>(::operator<<), std::ref(std::cout), _1));