这可能是一个过时的问题,因为我们有通用的参考文献。但是我说的是C ++ 98 ...因此,这是关于历史的一个问题。
[请不要在下面的示例中考虑到我所关注的问题...对我所关注的问题的解释将是多余的。
考虑
template<class T>
void f(T&){}
f(5);
为什么T
未被初始化为const int
?我可以写void f(const T&)
,它可以工作(在例外情况下,有时我们都需要),但这不是我的意思。
我要问的是-不将T
初始化为const int
的原因可能是什么?
在C ++ 98中,只有R值和L值,没有PR值,等等。>
此特定问题将通过对类使用partial specialisation或对函数使用直接函数覆盖来解决。部分专业化更加灵活,这就是为什么许多现代C ++更喜欢对象(例如,lambda函数是对象,而不是函数)的原因。参见functors
在较早的C ++中处理此问题的方法是编写两个函数。
template<class T> void f(T&){} template<class T> void f(const T&){}
然后,功能匹配规则将找到要使用的“最佳”规则。
这导致很多代码重复,这就是为什么通用引用如此流行的原因。