我遇到了一些使用类似这样的方法的代码:
QList<Item*> itemList;
void addItem(Item* const& item)
{
itemList.append(item);
}
现在,我无法看出它和这个之间有任何实质性的区别:
QList<Item*> itemList;
void addItem(Item* item)
{
itemList.append(item);
}
很明显,有人费尽心思使用了这样奇怪的类型。或者说是重构工具出了巨大的岔子。
是否有任何好的理由保留那个函数签名?有些特殊情况会产生不同的行为吗?我想不出来。
QList :: append
的签名中复制粘贴而来,该函数使用const T&
是因为它是通用的,对于所有类型T
,都可能很昂贵。编辑:嘿,代码中有T const&
,而我刚才查看的QT文档中有const T&
,但从意义上讲它们是相同的,所以可以认为是一种复制。 - Steve JessopItem*
复制起来可能很昂贵。我是说在QList
中,T
可能很昂贵。这位程序员(我怀疑)复制了一些与Item*
特定情况无关的代码。由于通过const
引用传递指针没有什么问题,他们甚至可能故意保持这种方式,以便看起来与QList::append
一致 - 当然对于不熟悉QList
的人来说,这是不协调的,因为你通常不会以这种方式传递指针。 - Steve JessopaddItem
需要获取item
的地址并将其与其他地方的地址进行比较,则无论您是否拥有对调用方传递的参数的引用或副本都很重要。显然,在这种情况下,QList::append
不会这样做。因此,它在这里不适用,但这是您不能盲目地替换所有T* const&
实例为T*
并期望永远不会出现问题的原因之一。因此,那个重构工具(如果有的话)保留了它的方式是正确的。 - Steve Jessop