2011-08-21 18 views
5

Według mojego kompilatora gcc-4.6 wywołanie func w poniższym przykładzie jest niejednoznaczne.Niejednoznaczne wywołanie (konwersja z char * do lambda vs std :: string)

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

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

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

Czy kompilator ma rację mówiąc to? Jeśli usuniemy pierwsze przeciążenie, ten kod się nie skompiluje, ponieważ nie będzie w stanie utworzyć odpowiednich szablonów.

Czy jest mimo to rozwiązanie tego problemu przy zmianie nazwy jednej z dwóch funkcji lub jawnej konwersji na std :: string?

Odpowiedz

3

Można też dodać trzeci przeciążenie wyraźnie uchwycić dosłowne ciąg sprawy:

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

To może być rozwiązany przez SFINAE w konstruktorze std::function. Wydaje się jednak, że nie jest to wymagane i nie jest dostarczane przez GCC. Więc nie możesz na tym polegać, na czym polega.

+0

To wydaje się śmieszne! –

+1

@ Tomalak: Jest. – Puppy

+0

Nie jestem nawet pewien, czy implementacje mogą to robić. Byłbym szczęśliwy, gdyby ktoś mógł znaleźć odniesienie do specyfikacji lub wyjaśnić dalej. –

Powiązane problemy