Перегруженная функция должна принимать оба функтора, учитывая, что тип лямбды можно разрешить (можно преобразовать в std::function
(пожалуйста, исправьте меня, если я ошибаюсь). Вопрос в том, почему ниже приведена ошибка компиляции, несмотря на то, что лямбда-тип явно определен? ( [&]() -> Type {}
)
Обратите внимание, что для моего текущего решения мне нужен захват по ссылке, поэтому код содержит логику для него.
Следующий пример описывает проблему:
#include <iostream>
#include <string>
#include <functional>
void do_some(std::function<void(int)> thing)
{
thing(5);
}
void do_some(std::function<bool(int)> thing)
{
if (thing(10))
{
std::cout << "it's true!" << std::endl;
}
}
int main()
{
int local_to_be_modified = 0;
do_some(
[&](int in)
{
local_to_be_modified = in;
std::cout << "This is void-" << std::endl;
}
);
do_some(
[&](int in) -> bool
{
// error: call to 'do_some' is ambiguous
local_to_be_modified += in;
std::cout << "This is bool-" << std::endl;
return true;
}
);
}
c++
c++11
lambda
implicit-conversion
std-function
Дэвид Тот
источник
источник
std::function<void(int)>
может быть построен даже из лямбды, которая что-то возвращает (что приводит к игнорированию возвращаемого значения).Ответы:
Потому что 2-е возвращаемое лямбда-выражение
bool
может преобразовываться в обаstd::function<void(int)>
иstd::function<bool(int)>
неявно.std::function
имеет конвертирующий конструктор:Как определение Callable ,
Обратите внимание, что 2-я лямбда, возвращающая
bool
, дляstd::function<void(int)>
, как показано выше,static_cast<void>(INVOKE(f, t1, t2, ..., tN))
является допустимым выражением (возвращаемое значениеbool
только что преобразовано вvoid
). Тогда это может также преобразовать вstd::function<void(int)>
неявно и вызывает проблему неоднозначности.источник
Вы можете явно
static_cast
лямбда для правильного типаИли сохраните лямбду в соответствующем
std::function<bool(int)>
типе и перейдите к функции (еслиdo_some(lmda)
она вызывается много раз)Или, как @MaxLanghof предложил просто построить
std::function<bool(int)>
из лямбды на ходуисточник
static_cast
и просто построитьstd::function
прямо из него. Это все, что происходит во время неявного преобразования.static_cast<
и последний,>
и он будет делать то же самое, но с меньшим набором текста. Для этого не нужно больше строк или чего-либо еще. godbolt.org/z/fQTqF4