vil*_*pam 7 c++ xcode clang c++11
将std :: bind与std :: function结合使用时,我无法理解一些细微之处.
我已将问题最小化到以下代码段:
#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;
}
Run Code Online (Sandbox Code Playgroud)
注意显式转换到std ::函数<>(代替std::function<void()>与auto施工时f2工作正常).
f2通过f1在OS X(XCode 5.0.1,OS X 10.9 SDK)上使用Clang 复制对象崩溃创建,但与VS2010/VS2012一起正常工作.在一个非常长的callstack之后,代码崩溃了一个EXC_BAD_ACCESS - 注意这是在构造函数对象时,而不是在调用它时.
这是库实现中的错误还是我的代码有问题?
解决方法是显式调用operator ()成员,如下所示:
std::function<void()> f2 =
std::bind(&std::function<void(int)>::operator(), f1, 1);
Run Code Online (Sandbox Code Playgroud)
但这有一个警告,因为它无法在VS2012上编译(但在VS2010中有效).这似乎是VS2012的一个错误.
您的代码与 clang 3.4 (trunk, 194324) 一起工作得很好。它也适用于 gcc 4.7.2。
我没有收到任何警告-Wall -Wextra -pedantic(除了那些抱怨未使用的 x、argc 和 argv 参数的警告)。
看起来 clang 的实现在过去是有问题的,但现在已经被修复了。
| 归档时间: |
|
| 查看次数: |
991 次 |
| 最近记录: |