【发布时间】:2021-12-31 00:23:48
【问题描述】:
我目前正在学习通用 lambda 函数,我很好奇以下之间的区别:
[](auto x){}; 和 []<typename T>(T x){};
他们都做同样的事情,但一个比另一个快?拥有这两种语法有什么意义。
【问题讨论】:
-
afaik 他们是等价的。另请参阅:stackoverflow.com/questions/17233547/…
我目前正在学习通用 lambda 函数,我很好奇以下之间的区别:
[](auto x){}; 和 []<typename T>(T x){};
他们都做同样的事情,但一个比另一个快?拥有这两种语法有什么意义。
【问题讨论】:
虽然两者在功能上是等价的,但是它们是C++14和C++20的特点,即泛型lambda和泛型lambda的模板语法,也就是说后者是仅在 C++20 中格式正确。
相比auto可以接受any类型,后者可以让lambda接受特定类型,例如:
[]<class T>(const std::vector<T>& x){};
此外,它还可以让 lambda 以更自然的形式转发参数:
[]<class... Args>(Args&&... args) {
return f(std::forward<Args>(args)...);
};
您可以通过原论文P0428获取更多详情。
【讨论】: