std :: bind를 std :: function과 결합 할 때 몇 가지 미묘한 점을 이해하는 데 어려움이 있습니다.std :: bind에 std :: function이 Clang으로 충돌합니다.
내가 다음 코드 조각에 내 문제를 최소화했다 :
#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 :: 기능 <> (f2
을 구성하는 것은 잘 작동 할 때 auto
와 std::function<void()>
교체).
f1
개체를 복사하여 f2
을 생성하면 OS X (XCode 5.0.1, OS X 10.9 SDK)의 Clang과 충돌하지만 VS2010/VS2012에서는 문제가 없습니다. 숨 막히 긴 콜 스택 (callstack) 후에 코드가 EXC_BAD_ACCESS와 충돌합니다. 을 호출 할 때을 구성 할 때가 아닙니다.
이 코드는 라이브러리 구현의 버그입니까? 내 코드의 문제입니까?
std::function<void()> f2 =
std::bind(&std::function<void(int)>::operator(), f1, 1);
있지만 VS2012에서 컴파일에 실패로이는 경고와 함께 제공됩니다 (하지만 VS2010에서 작동) :
해결 방법은 명시 적으로처럼 operator()
멤버 호출하는 것입니다. 이것은 a bug with VS2012 인 것 같습니다.
관련 질문 http://stackoverflow.com/q/19820128/227322 것 같습니다. – villintehaspam