dro*_*del 4 c++ lambda templates perfect-forwarding c++14
我看到的代码如下:
template<class Function>
void MyFunc(Function&& function) { function(...); }
Run Code Online (Sandbox Code Playgroud)
&&与仅按值复制函数相比,这里的优势是什么?作为参考,我使用的是 C++14。
Gui*_*cot 12
问题来自避免复制。
想象一下:
auto lambda = [ptr = std::make_unique<int>(0)]() mutable {
std::cout << *ptr;
ptr = std::make_unique<int>(*ptr + 1); // why not?
};
MyFunc(lambda); // use it normally
MyFunc([]{ std::cout << " end"; }); // use by using a temporary lambda
lambda() // just call the function after that
Run Code Online (Sandbox Code Playgroud)
如果签名是MyFunc(Function f),则需要 astd::move并且 lambda 在调用后将无法使用。
如果签名是MyFunc(Function const& f),则它将不起作用,因为 lambda 是可变的。
如果是,MyFunc(Function& f)那么临时将不起作用。
你基本上只剩下MyFunc(Function&& f).
然而,真正的问题是“我需要支持所有这些案例吗?”
我会说:大多数时候没有。大多数情况下,按值接收 lambda 是最简单的,并且几乎支持所有情况。这就是 STL 的方式。
为什么?因为函数对象的完美转发真的很难做到完美,而且在大多数情况下你不能以一种完美的通用方式多次调用函数。仅当我想包装一个函数时,我才会完善转发一个函数,想要完全避免复制,并且我希望函数对象被 ref 限定为临时对象。
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |