2016-01-02 7 views
2

Должны ли/умные указатели передаваться по ссылке в функциях?Должны/Могут ли интеллектуальные указатели передаваться по ссылке в функциях

Ie:

void foo(const std::weak_ptr<bar>& x) 
+0

Can легко узнать, могу ли я спросить, почему вы думаете, что это не должно? – Borgleader

+1

Возможный дубликат [Как передать интеллектуальные указатели в функции?] (Http://stackoverflow.com/questions/12519812/how-do-i-pass-smart-pointers-into-functions) – 5gon12eder

+0

@ 5gon12eder: Почти, но не печенье. Это может/должно, вот как. – Deduplicator

ответ

2

Конечно, вы можете передать смарт-указатель на const&.

Существует также причина сделать так:
Если функция, принимающая сказал смарт-указатель только фронт для одного принятия необработанного (наблюдения) указатель для манипулирования (потенциал) pointee.
Никогда не заставляйте никого использовать смарт-указатель для чего-либо, кроме передачи/совместного использования, они могут не управлять им тем, на кого вы настаиваете.

Во всех остальных случаях, с помощью смарт-указателя подразумевает передачи/обмен собственности и избежать дешевую копию (только тест имеет ли оно что-нибудь и подсчет ссылок, а также два экземпляра указателя) Безразлично На самом деле ты ничего не покупаешь.

+1

В качестве пояснения: Написание 'unshared_ptr' - это просто (что делает вид, что является общим ptr для что-то, но ложь), а также обертывание другого умного указателя. Проблема в том, что, принимая определенную семантику, вы подразумеваете их использование, и полное подчинение семантике невозможно. – Yakk

0

Нет, если речь идет о std умные указатели. const T & не может передавать/владеть акциями, поэтому необработанный не-владелец T * всегда лучше и эффективнее.

Смежные вопросы