存储 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()
,这可能不是您想要的。
在接收和存储 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()
,这可能不是您想要的。