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