【发布时间】:2013-11-20 13:43:36
【问题描述】:
在将 std::bind 与 std::function 结合使用时,我无法理解一些微妙之处。
我已将我的问题最小化为以下代码 sn-p:
#include <functional>
#include <iostream>
void bar(int x) {
std::cout << "Hello." << std::endl;
}
int main(int argc, char* argv[])
{
std::function<void(int)> f1 = std::bind(bar, std::placeholders::_1);
// CRASHES with clang, works fine in VS2010 and VS2012
std::function<void()> f2 = std::bind(f1, 1);
f2();
return 0;
}
注意到 std::function 的显式转换(在构造 f2 时将 std::function<void()> 替换为 auto 可以正常工作)。
通过复制f1 对象来创建f2 在 OS X(XCode 5.0.1、OS X 10.9 SDK)上使用 Clang 会崩溃,但在 VS2010/VS2012 上运行良好。在一个长得可怕的调用堆栈之后,代码崩溃并出现 EXC_BAD_ACCESS - 注意这是在构造函数对象时,而不是在调用它时。
这是库实现中的错误还是我的代码有问题?
一种解决方法是显式调用operator () 成员,如下所示:
std::function<void()> f2 =
std::bind(&std::function<void(int)>::operator(), f1, 1);
但这有一个警告,因为它无法在 VS2012 上编译(但在 VS2010 中有效)。这似乎是a bug with VS2012。
【问题讨论】:
-
一个相关的问题好像是stackoverflow.com/q/19820128/227322。