小编nou*_*ius的帖子

如何使用访问者在 lambda 中调用 std::visit ,访问者是按值捕获的函数对象

似乎std::visit在 lambda 中使用访问者调用并不简单,访问者是由值捕获的函数对象。虽然通过引用捕获工作正常。为什么会这样,是否有可能做到这一点?

在这种情况下,我不明白来自 MSVC 2017 的编译错误消息:

std::visit': 找不到匹配的重载函数
未能专门化函数模板未知类型 std::visit(_Callable &&,_Variants &&...)

我认为模板参数推导的行为与仅在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);

}
Run Code Online (Sandbox Code Playgroud)

c++ lambda generic-lambda c++17 std-variant

1
推荐指数
1
解决办法
353
查看次数

标签 统计

c++ ×1

c++17 ×1

generic-lambda ×1

lambda ×1

std-variant ×1