Неоднозначный вызов (преобразование из char * в лямбду против std :: string) - PullRequest
5 голосов
/ 21 августа 2011

Согласно моему компилятору gcc-4.6, вызов func в приведенном ниже примере неоднозначен.

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

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

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

Правильно ли это сказано компилятором?Если я уберу первую перегрузку, этот код не скомпилируется, так как он не сможет создать экземпляр соответствующих шаблонов.

Есть ли способ решить эту проблему, кроме переименования одной из двух функций или явного преобразования в std ::строка

Ответы [ 2 ]

4 голосов
/ 21 августа 2011

Может быть разрешено SFINAE в конструкторе std::function. Тем не менее, это, кажется, не требуется и не предоставляется GCC. Так что вы не можете полагаться на то, что все получится.

3 голосов
/ 21 августа 2011

Вы также можете добавить третью перегрузку для явного захвата строкового литерала:

void func(char const* cstr) {
    return func(std::string(cstr));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...