Преимущества использования reference_wrapper вместо необработанного указателя в контейнерах? - PullRequest
23 голосов
/ 05 февраля 2012

Какие преимущества имеет использование std::reference_wrapper в качестве параметра шаблона для контейнеров вместо необработанных указателей?То есть std::vector<std::reference_wrapper<MyClass> > против std::vector<MyClass*>

Мне нравится забывать о пустых значениях и не нужно использовать синтаксис указателя, но многословие типов (то есть vector<reference_wrapper<MyClass> >) плюс наличие на сайте вызова использования std ::ссылка на фактическую ссылку заставляет меня думать, что это того не стоит.

Я имею в виду случаи, когда использование std :: shared_ptr или любого другого умного указателя не является опцией.

есть ли другие преимущества использования reference_wrapper или каких-либо других факторов, которые я в настоящее время не принимаю во внимание?(Я думаю, что мой вопрос относится как к reference_wrapper C ++ 11, так и к boost)

Ответы [ 2 ]

20 голосов
/ 05 февраля 2012

Я не думаю, что есть техническая разница. Ссылочная оболочка обеспечивает базовую функциональность указателя, включая возможность динамического изменения цели.

Одним из преимуществ является то, что оно демонстрирует намерение. Он говорит людям, которые читают код, что «тот, кто» имеет переменную, фактически не контролирует ее продолжительность жизни. Пользователь не забыл удалить или обновить что-либо, что некоторые люди могут начать искать, когда увидят семантику указателя.

0 голосов
/ 12 января 2016

C ссылки действительно проблематичны при работе с шаблонами.Если вам «повезло» скомпилировать код со ссылкой в ​​качестве параметра шаблона, у вас могут возникнуть проблемы с кодом, который будет работать (по некоторым причинам) следующим образом:

template<class T> f(T x) { g(x); }
template<class T> g(T x) { x++; }

Тогда, даже если вы вызовете f<int&>(x)это будет называть g<int>.Но reference_wrapper отлично работает с шаблонами.

Как уже упоминалось ранее - у вас будут проблемы с компиляцией таких вещей, как vector<int&>, но vector<reference_wrapper<int>> отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...