为什么bind在lambda工作时什么都不做

时间:2014-05-27 17:55:36

标签: c++ c++11

我问了最初的问题before。现在我有一个后续问题。这是代码:

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绑定实现什么都不做?它编译,但什么都不做。

2 个答案:

答案 0 :(得分:2)

演员表无效,您需要转换为参考

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

或指针

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

两者都适用于std::bind

Live example

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

答案 1 :(得分:1)

您的代码无法在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));