Je veux passer un pointeur partagé à une fonction. Dites-moi comment faire.
Je ne peux que penser à deux raisons de prendre un shared_ptr
argument:
- La fonction veut partager la propriété de l'objet;
- La fonction effectue une opération qui travaille spécifiquement sur
shared_ptr
s.
Qui êtes-vous intéressé?
Je suis à la recherche d'une réponse d'ordre général, donc je suis vraiment intéressé à la fois. Je suis curieux de savoir ce que tu veux dire dans le cas n ° 2, si.
Des exemples de ces fonctions comprennent std::static_pointer_cast
, personnalisé comparateurs, ou prédicats. Par exemple, si vous avez besoin de trouver tous uniques shared_ptr à partir d'un vecteur, vous avez besoin d'un tel prédicat.
Ah, quand la fonction les besoins de manipuler le pointeur intelligent lui-même.
Exactement.
Dans ce cas, je pense que nous devrions passer par référence.
Oui. Et si elle ne change pas le pointeur, vous voulez passer par référence const. Il n'y a pas besoin de copier puisque vous n'avez pas besoin de partager la propriété. C'est l'autre scénario.
Ok, l'a obtenu. Parlons un peu du scénario.
Celui où vous partagez la propriété? Ok. Comment voulez-vous partager la propriété avec des shared_ptr
?
En le copiant.
Alors la fonction aurez besoin de faire une copie d'un shared_ptr
, correct?
Évidemment. J'ai donc passer par une référence à const et copie d'une variable locale?
Non, c'est une pessimization. Si il est passé par référence, la fonction aura pas le choix de faire de la copie manuellement. Si il est passé par valeur, le compilateur choisir le meilleur choix entre une copie et un déplacer et effectuer automatiquement. Ainsi, le passage par valeur.
Bon point. Je dois me rappeler que "Veulent la Vitesse? Le passage par Valeur." l'article le plus souvent.
Attendez, si la fonction stocke l' shared_ptr
dans une variable de membre, par exemple? Ne sera pas que faire une copie redondante?
La fonction peut simplement déplacer l' shared_ptr
argument en sa mémoire. Le déplacement d'un shared_ptr
n'est pas cher parce qu'il n'est pas prêt de changer le nombre de références.
Ah, bonne idée.
Mais je pense à un troisième scénario: que faire si vous ne voulez pas manipuler l' shared_ptr
, ni à la détention d'actions?
Dans ce cas, shared_ptr
est totalement indifférent à la fonction. Si vous souhaitez manipuler les pointee, prendre un pointee, et de laisser les appelants de choisir quelle sémantique de propriété qu'ils veulent.
Et dois-je prendre le pointee par référence ou par valeur?
Les règles habituelles s'appliquent. Les pointeurs intelligents de ne pas changer quoi que ce soit.
Le passage par valeur si je vais copier, passage par référence si je veux éviter une copie.
La droite.
Hmm. Je crois que vous avez oublié encore un autre scénario. Que faire si je veux partager la propriété, mais seulement en fonction d'un certain état?
Ah, un intéressant cas de bord. Je n'attends pas que cela arrive souvent. Mais quand il arrive, vous pouvez passer soit par valeur et d'ignorer la copie si vous n'en avez pas besoin, ou de passer par renvoi et en faire une copie si vous en avez besoin.
Je risque une copie redondante dans la première option, et de perdre un potentiel de se déplacer dans la seconde. Je ne peux pas manger le gâteau et l'avoir aussi?
Si vous êtes dans une situation où ce qui importe vraiment, vous pouvez fournir deux surcharges, l'un prenant un const lvalue de référence, et de l'autre la prise de référence rvalue. L'un des exemplaires, l'autre se déplace. Un parfait transfert de modèle de fonction est une autre option.
Je pense que tous les scénarios possibles. Je vous remercie beaucoup.