C++ 呼叫完美转发的lambda
我有以下类,它存储对函数的完全转发引用:C++ 呼叫完美转发的lambda,c++,forwarding,perfect,C++,Forwarding,Perfect,我有以下类,它存储对函数的完全转发引用: template <class F> class Visitor { public: Visitor(F &&f) : _f(std::forward<F>(f)) { } xt::LOOP_CONTROL OnElem(xvi::Elem &elem) { return _f(elem); // or should it be
template <class F>
class Visitor
{
public:
Visitor(F &&f) : _f(std::forward<F>(f))
{
}
xt::LOOP_CONTROL OnElem(xvi::Elem &elem)
{
return _f(elem);
// or should it be:
// return std::forward<F>(_f)(elem);
}
private:
F &&_f;
};
模板
班级访客
{
公众:
访客(F&F):\U F(标准::前进(F))
{
}
xt::回路控制OnElem(xvi::Elem&Elem)
{
返回f(elem);
//或者应该是:
//返回标准::转发(_f)(elem);
}
私人:
F&&u F;
};
想知道调用
\u f(elem)
或std::forward(\u f)(elem)是否有区别代码>?Lambda当前不能有ref限定的运算符()
,因此对于它们,两种形式是等效的
对于自定义函子,它可能与std::forward(_f)(elem)不同代码>:
struct MyFunctor
{
xt::LOOP_CONTROL operator()(xvi::Elem&Elem)和{std::coutLambda当前不能有ref-qualified操作符()
,因此对它们来说,这两种形式是等效的
对于自定义函子,它可能与std::forward(_f)(elem);
不同:
struct MyFunctor
{
xt::LOOP_CONTROL operator()(xvi::Elem&Elem)和{std::cout通常您会转发参数,而不是函数本身。尽管从技术上讲,人们可以引用操作符()
来处理左值或右值,但我不相信它在实践中执行得太多。这是非常不可能的\u f(Elem)
将被破坏。通常你会转发参数,而不是函数本身。尽管从技术上讲,人们可以引用操作符()
来处理左值或右值,但我不相信它在实践中执行得太多。这是非常不可能的\u f(elem)
将被破坏。非常感谢您的回答,我还没有看到对ref限定函数的需求,但也许有一天这会派上用场。我看到的一个可能有用的函数允许生命周期扩展auto&&extended=Tmp().getObj();
使用Obj getObj()&&
(在这里按值返回以允许生命周期扩展)/Obj&getObj()&
/const-Obj&getObj()const&
。再次感谢@Jarod42这是一个很好的用例。非常感谢您的回答,我还没有看到对ref-qualified函数的需求,但也许有一天这会派上用场。我看到的一个可能有助于它允许生命周期扩展auto&&extended=Tmp()。getObj()
带有Obj-getObj()&&&
(此处按值返回以允许生存期延长)/Obj-getObj()&
/const-Obj&getObj()const&
。再次感谢@Jarod42这是一个很好的用例。
struct MyFunctor
{
xt::LOOP_CONTROL operator()(xvi::Elem &elem) & { std::cout << "lvalue"; return {};}
xt::LOOP_CONTROL operator()(xvi::Elem &elem) && { std::cout << "rvalue"; return {};}
};
xvi::Elem elem;
Visitor<MyFunctor>(MyFunctor{}).OnElem(elem); // rvalue
MyFunctor func;
Visitor<MyFunctor&>(func).OnElem(elem); // lvalue