В чем разница между boost::ref(i)
и & i
? Каковы ситуации, когда мы не можем использовать регулярные ссылки и вместо этого нужно идти за boost::ref
? При необходимости укажите примеры.Разница между boost :: ref и регулярными ссылками
ответ
Цель повышение :: reference_wrapper является содержать ссылку на объект типа T. Это в основном используется для «кормить» ссылки на шаблоны функций (алгоритмы), которые принимают свой параметр по значению.
NB: Важное различие между boost::reference_wrapper
и std::reference_wrapper
(по крайней мере, повышающего 1.52) является способность std::reference_wrapper
идеально обернуть функциональные объекты.
Это позволяет такой код:
// functor that counts how often it was applied
struct counting_plus {
counting_plus() : applications(0) {}
int applications;
int operator()(const int& x, const int& y)
{ ++applications; return x + y; }
};
std::vector<int> x = {1, 2, 3}, y = {1, 2, 3}, result;
counting_plus f;
std::transform(begin(x), end(x), begin(y),
std::back_inserter(result), std::ref(f));
std::cout << "counting_plus has been applied " << f.applications
<< " times." << '\n';
В Boost.Thread, например:
Новый поток запускается при пропускании объект отзывной типа, который может быть вызывается без параметров к конструктору . Затем объект копируется во внутреннее хранилище и вызывается на вновь созданный поток выполнения. Если объект не должен (или не может) быть скопирован , то boost :: ref может использоваться для передачи в ссылку на функцию объект. В этом случае пользователь Boost.Thread должен убедиться, что упомянутый объект переживает вновь созданный поток выполнения .
код из дока:
struct callable
{
void operator()();
};
boost::thread copies_are_safe()
{
callable x;
return boost::thread(x);
} // x is destroyed, but the newly-created thread has a copy, so this is OK
boost::thread oops()
{
callable x;
return boost::thread(boost::ref(x));
} // x is destroyed, but the newly-created thread still has a reference
// this leads to undefined behaviour
- 1. разница между регулярными выражениями
- 2. разница между ссылками и указателями
- 3. путаница между std :: [tr1 ::] ref и boost :: ref
- 4. Разница между boost :: mutex и boost :: timed_mutex
- 5. Разница между boost :: unique_lock и boost :: upgrade_lock?
- 6. разница между 2 регулярными выражениями
- 7. разница между двумя регулярными выражениями
- 8. Разница между двумя регулярными выражениями?
- 9. Разница между этими регулярными выражениями?
- 10. В чем разница между ref и out?
- 11. В чем разница между REF и HAL?
- 12. Разница между 'const ref' и 'in'?
- 13. Есть ли разница между универсальными ссылками и ссылками на пересылку?
- 14. Разница между текстовыми ссылками и ссылками на int в SQLite?
- 15. разница между указателями и ссылками на C++
- 16. Разница между символическими ссылками и ярлыками
- 17. Разница между «итераторами» и «ссылками на элементы»
- 18. Разница между символическими ссылками и каталогами Windows
- 19. В чем разница между boost :: static_pointer_cast vs boost :: shared_static_cast?
- 20. Разница между ссылками в javascript и babel в реакцииJS
- 21. Разница между boost :: split vs boost :: iter_split
- 22. В чем разница между этими регулярными выражениями
- 23. Разница между этими двумя регулярными выражениями?
- 24. Разница между регулярными выражениями для нахождения слова?
- 25. Любая разница между этими двумя регулярными выражениями?
- 26. Разница между boost async_write() и non_blocking socket.send()
- 27. Разница между Boost Thread и thread_group
- 28. Разница между pthread_spinlock и boost :: smart_ptr :: spinlock?
- 29. В чем разница между Boost :: bind и Boost Phoenix :: bind?
- 30. Использование Boost :: ref правильно ..?
@Venkat Шива: Ситуация «Когда алгоритмы должны принимать их параметры по значению», и вы не хотите брать на себя исполнение наказания в виде передачи объекта по значению , –
Я думаю, что я должен правильно прочитать документацию, прежде чем отправлять вопросы. Извините за беспокойство. –