我想编写一个函数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()
(即除了将参数转发给另一个函数之外,不应该触及该参数)?
答案 0 :(得分:4)
是的,转发引用是正确的方式,如果它让您平静,您当然可以转发参数:
template <typename T> void foo(T&& x){
std::forward<T>(x)();
}
现在它甚至可以与ref-qualified呼叫运营商合作。
答案 1 :(得分:0)
是的,这是转发参考的全部目的。
除了将参数转发给其他功能外,不应触及该参数
这正是你正在做的事情。