Const Références à des Pointeurs

Je suis tombé sur un code qui est utilisé une méthode comme ceci:

QList<Item*> itemList;
void addItem(Item* const& item)
{
    itemList.append(item);
}

Maintenant, je ne vois aucune différence significative entre ça et ce:

QList<Item*> itemList;
void addItem(Item* item)
{
   itemList.append(item);
}

Mais, évidemment, quelqu'un est allé moyen de sortir de leur façon de l'utiliser tel un drôle de type. Ou peut-être un outil de refactoring a horriblement mal tourné.

Est-il une bonne raison de garder que la signature de fonction? Une sorte de cas de coin qui se comporte différemment? Je ne peux pas penser à quelque chose.

Probablement juste un copier-coller à partir de la signature de QList::append, qui prend const T& car il est générique et pour tout ce qu'il sait, T est cher à copier. Edit: Hé, pas littéralement un copier-coller parce que votre code a T const& alors que l'intervalle QT docs que j'ai juste vérifié ont const T&. Mais mentalement une copie, puisque le sens est le même.
Ce n'est pas le passage d'un objet par référence, c'est en passant un pointeur vers un objet. Il n'y aura pas chers de la copie. Je ne peux pas penser à quelque chose, soit, mais peut-être pour l'utilisation de const itérateurs?
Je sais. Je ne dis pas que Item* pourrait coûter cher à la copie. Je suis en train de dire que, dans QList, T pourrait coûter cher à la copie. Ce programmeur a (que je soupçonne), copié du code qui a des préoccupations de pertinence pour le cas spécifique de Item*. Car il n'y a rien de vraiment mal avec le passage d'un pointeur par const de référence, ils peuvent même avoir gardé comme ça, délibérément, de sorte qu'il soit compatible avec QList::append - bien sûr, pour les gens peu familiers avec QList, c'est incongru puisque vous ne serait pas normalement passer un pointeur de cette façon.
Qui est en fait beaucoup de sens. Si un outil de refactoring déduit le type de hors d'usage, vous auriez probablement jusqu'à la fin.
Et btw, en général, il y a des fonctions pour lesquelles il fait une différence - si addItem étaient à prendre l'adresse de item et de la comparer avec d'autres adresses d'ailleurs, puis c'est important de savoir si vous avez une référence à ce que l'appelant est transmise comme argument, ou une copie de celui-ci. Évidemment, dans ce cas, QList::append ne pas le faire. Donc, il ne s'applique pas ici, mais c'est une raison pour laquelle vous ne pouvez pas simplement aller autour de la aveuglément remplacer toutes les instances de T* const& avec T* et s'attendre à ne jamais rien casser. Ainsi que refactoriser outil (si il y en avait un) a droit à un congé de cette façon.

OriginalL'auteur cgmb | 2011-03-26