存储 C++ lambda 的方法:模板与非模板形式?

Method to store C++ lambda: template vs non-template form?

在接收和存储 lambda 函数时,我通常会看到:

struct foo {
    std::function<void()> myFunc;

    template<typename F>
    void foo(F&& func) {
        myFunc = std::move(func);
    }
};

上面的表格比下面的表格有什么优势吗?

struct foo {
    std::function<void()> myFunc;

    void foo(std::function<void()>&& func) {
        myFunc = std::move(func);
    }
};

我正在使用 C++17。

第一种形式

 template<typename F>
    void foo(F&& func) {
        myFunc = std::move(func);
    }

F&&forwarding 参考,因此您对 std::move() 的使用不正确 - 您应该改用 std::forward<F>(func)。应用此修复程序后,此表单将正确处理左值和右值参数。

第二种形式

void foo(std::function<void()>&& func) {
        myFunc = std::move(func);
    }

std::function<void()>&& func 是一个 rvalue 引用,因此您只能使用右值调用 foo(),这可能不是您想要的。