转发模板参数的常量,我应该使用转发引用吗?

时间:2017-05-03 09:55:30

标签: c++ c++11 templates const forwarding-reference

我想编写一个函数foo,它应该调用其参数的operator(),如下面(破碎)代码所示:

template <typename T> void foo(const T& x){
    x();
}

struct MyFunctor{
    int data;
    void operator()(){
        /* stuff that might modify the data */
    }
};

int main()
{
    foo(MyFunctor{});
}

显然代码不起作用,因为operator()不是const,但foo()要求其参数为const

作为模板函数,foo()应与const和非const仿函数一起使用,而不是挑剔其const - 其参数。< / p>

如果我通过将foo()移至以下内容来更改const

template <typename T> void foo(T& x) { /* ... */ }

...它也不会起作用,因为您无法将右值引用转换为非const左值引用,因此无法调用foo(MyFunctor{})

foo()更改为转发引用可解决所有问题:

template <typename T> void foo(T&& x) { /* ... */ }

但这是&#34;对&#34;办法?转发参考不应仅用于std::forward()(即除了将参数转发给另一个函数之外,不应该触及该参数)?

2 个答案:

答案 0 :(得分:4)

是的,转发引用是正确的方式,如果它让您平静,您当然可以转发参数:

template <typename T> void foo(T&& x){
    std::forward<T>(x)();
}

现在它甚至可以与ref-qualified呼叫运营商合作。

答案 1 :(得分:0)

是的,这是转发参考的全部目的。

  

除了将参数转发给其他功能外,不应触及该参数

这正是你正在做的事情。