定义通过引用接收 int->int
lambda 参数的函数的正确方法是什么?
void f(std::function< int(int) >& lambda);
或者
void f(auto& lambda);
我不确定最后一种形式是否合法。
还有其他方法来定义 lambda 参数吗?
原文由 lurscher 发布,翻译遵循 CC BY-SA 4.0 许可协议
定义通过引用接收 int->int
lambda 参数的函数的正确方法是什么?
void f(std::function< int(int) >& lambda);
或者
void f(auto& lambda);
我不确定最后一种形式是否合法。
还有其他方法来定义 lambda 参数吗?
原文由 lurscher 发布,翻译遵循 CC BY-SA 4.0 许可协议
从 C++ 20 开始,
void f(auto& lambda);
实际工作(它是一个 缩写的函数模板):
当占位符类型(
auto
或Concept auto
)出现在函数声明或函数模板声明的参数列表中时,该声明声明了一个函数模板,并且一个发明的模板参数用于每个占位符都附加到模板参数列表中
它完全等同于@bdonlan’s answer中的选项2:
template<typename F>
void f(F &lambda) { /* ... */}
原文由 Alexey Romanov 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
您不能有
auto
参数。你基本上有两个选择:选项 #1:使用
std::function
如您所示。选项 #2:使用模板参数:
在某些情况下,选项 #2 可能更有效,因为它可以避免嵌入式 lambda 函数对象的潜在堆分配,但只有当
f
可以作为模板函数放置在标题中时才有可能.它还可能会增加编译时间和 I-cache 占用空间,任何模板都可以。请注意,它也可能没有效果,好像 lambda 函数对象足够小,它可以在std::function
对象中内联表示。不要忘记在引用
std::forward<F&&>(lambda)
时使用 ---lambda
,因为它是一个 r 值引用。