为什么当lambda工作时bind什么也不做?
Why bind does nothing while lambda works
我之前问过这个问题。我还有一个问题。下面是代码:
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
一起工作。
请注意,您的原始代码被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));
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- bind(<void>ref(acc), _1) 是什么意思?
- bind()与C++11 lambdas相比有什么优势(除了兼容性)吗
- 特定 std::bind 返回的数据类型到底是什么
- std::bind 和 std::thread 总是复制参数背后的基本原理是什么?
- 重用 boost::bind 调用的返回值的正确方法是什么?
- "bind directly"在引用初始化中是什么意思?
- 与Boost.Bind相比,Boost.Function有什么好处?
- 这种使用 boost::lambda::bind 有什么问题?
- 为什么当lambda工作时bind什么也不做?
- 什么时候应该使用std::bind
- 将boost::bind成员函数传递给wt侦听器.我做错了什么?
- Std::function和Std::bind是什么,什么时候应该使用它们
- boost::bind的返回类型是什么