2013-11-20 2 views
7

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을 구성하는 것은 잘 작동 할 때 autostd::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 인 것 같습니다.

+0

관련 질문 http://stackoverflow.com/q/19820128/227322 것 같습니다. – villintehaspam

답변

2

코드는 clang 3.4 (트렁크, 194324)에서 제대로 작동합니다. 또한 gcc 4.7.2와 호환됩니다.

-Wall -Wextra -pedantic (사용되지 않는 x, argc 및 argv 매개 변수에 대해 불만을 제외하고)과 관련된 경고는 표시되지 않습니다.

마치 이전에 clang 구현이 버그가있는 것처럼 보였지만 수정되었습니다.

+0

맞습니다. Xcode 5.0.2로 업그레이드하는 것이 트릭을 수행하는 것으로 보입니다. – villintehaspam

+0

@villintehaspam 듣기 좋다! – Ali

+0

그러나주의 할 점은, App Store에서 다운로드 한 Xcode 5.0.2와 developer.apple.com에서 다운로드 한 Xcode 5.0.2 사이에는 약간의 차이가있는 것으로 보입니다. dev에서 다운로드 한 버전에서 작동하지만 App Store에서 다운로드 한 버전에는 작동하지 않습니다. – villintehaspam

관련 문제