我想编写一个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()
是 non- const
,但foo()
需要它的参数是const
。
作为一个模板函数,foo()
应该const
与非仿函数一起使用const
,并且不要对其参数的 -ness 挑剔const
。
如果我foo()
通过删除const
以下内容进行更改:
template <typename T> void foo(T& x) { /* ... */ }
...它也不起作用,因为您无法将右值引用转换为非const
左值引用,因此foo(MyFunctor{})
无法调用。
更改foo()
为转发参考可以解决所有问题:
template <typename T> void foo(T&& x) { /* ... */ }
但这是“正确”的方式吗?转发引用不应该只用于std::forward()
(即除了将其转发到另一个函数之外,不应触及参数)吗?