2011-08-21 3 views
5

제 컴파일러 gcc-4.6에 따르면 아래 예제에서 func을 호출하는 것은 불분명합니다.모호한 호출 (char *에서 lambda 대 std :: string으로의 변환)

void func(const std::string &str) { 
} 

void func(std::function<std::string()> f) { 
} 

void test() { 
    func("Hello"); 
} 

컴파일러가이 말을 올바르게 사용합니까? 첫 번째 오버로드를 제거하면 관련 템플릿을 인스턴스화하지 못하기 때문에이 코드가 컴파일되지 않습니다.

두 함수 중 하나의 이름을 바꾸거나 std :: string으로 명시 적으로 변환하여이 문제를 해결할 수 있습니까?

답변

3

또한 명시 적으로 문자열 리터럴의 경우를 캡처하는 세 번째 오버로드를 추가 할 수 있습니다

void func(char const* cstr) { 
    return func(std::string(cstr)); 
} 
4

그것은 std::function의 생성자에서 SFINAE 해결할 수 있습니다. 그러나, 그것은 필요하지 않는 것처럼 보이고 GCC에 의해 제공되지 않습니다. 그래서 당신은 이식 할 수 없다.

+0

어색해 보입니다. –

+1

@Tomalak : 그렇습니다. – Puppy

+0

구현을 허용할지 여부는 확실하지 않습니다. 누군가가 스펙 참조를 찾거나 더 설명 할 수 있다면 기쁠 것입니다. –

관련 문제