【发布时间】:2020-06-17 07:02:33
【问题描述】:
在 lambda 中使用访问者调用 std::visit 似乎并不简单,访问者是按值捕获的函数对象。不过,通过引用捕获效果很好。为什么会这样,是否有可能做到这一点?
我不理解这种情况下的编译错误消息,来自 MSVC 2017:
std::visit': 找不到匹配的重载函数
无法专门化函数模板未知类型 std::visit(_Callable &&,_变体 &&...)
我假设模板参数推导的行为与仅调用 std::visit 而没有包装调用的 lambda 非常相似。
说明问题的代码:
#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);
}
【问题讨论】:
标签: c++ lambda c++17 generic-lambda std-variant