考虑以下两个原型:
template<class T>
void whatever1(const T& something);
template<class T>
void whatever2(T const& something);
它们都是相同的。然而,如果T
不是通常的类型,而是指针类型呢?例如, let be T
thenSomewhere*
会有不同的解释:whatever1
whatever2
// nonconst pointer (passed by reference) to const object
void whatever1(const Somewhere*& something);
// const pointer (passed by reference) to nonconst object
void whatever2(Somewhere* const& something);
在这种情况下,我可以推断出以下属性:
1 whatever1
:
a) 可以something
在内部进行修改,并将这些更改传播到外部;
b) 指向的对象something
不能被修改。
2 whatever2
:
a) 不能something
在内部进行修改,因此在外部是安全的;
b)something
可以修改指向的对象。
通常const
和&
一起使用,以避免在传递参数时复制,同时保护该参数不被修改。那么就这种哲学而言,它只whatever2
发挥了它的作用。但是,如果我希望所指向的对象something
也是不可修改的,那么两个都不适合!那么会是什么呢?也许这个笑话:
template<class T>
void whatever3(const T const& something);
除了这种混乱之外,有些人使用whatever1
风格,而另一些人则使用whatever2
一种。根据经验,在创建泛型类和方法时应该使用哪一个?
请注意,如果我们开始考虑Somewhere**
事情T
变得更加混乱。