Кажется, что нелегко вызвать std::visit
внутри лямбды, используя посетителя, который является функциональным объектом, захваченным значением. Захват по ссылке работает нормально, хотя. Почему это так и возможно ли это как-то сделать?
Я не понимаю сообщение об ошибке компиляции в этом случае от MSV C 2017:
std :: visit ': не найдено соответствующей перегруженной функции
Не удалось шаблон специализированной функции неизвестного типа std :: visit (_Callable &&, _ Variants && ...)
Я предполагал, что вывод аргумента шаблона будет вести себя очень похоже на простой вызов std::visit
без лямбды, которая завершение вызова.
Код, иллюстрирующий проблему:
#include <variant>
struct T {
void operator()(int i) {};
void operator()(float f) {};
};
int main()
{
std::variant<int, float> v = 1;
T t;
// Does not compile.
//auto l1 = [t](auto v) { std::visit(t, v); };
//l1(v);
// Compiles.
auto l2 = [&t](auto v) { std::visit(t, v); };
l2(v);
// Compiles.
std::visit(t, v);
}