【问题标题】:How to call std::visit inside a lambda with a visitor that is a function object captured by value如何调用STD ::在Lambda内访问Lambda,该访问者是由value捕获的函数对象
【发布时间】: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


    【解决方案1】:

    由 lambda 生成的调用运算符标记为 const,因此与 const 方法一样,this 的所有成员也标记为 const。由于 T 的调用运算符未标记为 const,因此您不能从 lambda 调用它们。它适用于通过引用捕获的 lambda,因为 const 不会与指针和引用数据成员一起传播。

    所以要解决这个问题,你可以标记 lambda mutable 这将使调用运算符不是 const,像你一样通过引用捕获,或者标记 T const 的调用运算符。

    【讨论】:

      猜你喜欢
      • 2011-07-08
      • 2021-06-09
      • 2019-03-09
      • 1970-01-01
      • 2018-09-17
      • 2020-08-19
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多