Различие между повышением:: касательно и регулярные ссылки

Между чем различие boost::ref(i) и & i ? Что является ситуациями, где мы не можем использовать регулярные ссылки и иметь для движения для boost::ref вместо этого? Включайте примеры, если это возможно.

9
задан Venkat Shiva 1 April 2010 в 14:50
поделиться

2 ответа

Из Boost.Ref Документация :

Цель boost :: reference_wrapper состоит в том, чтобы содержать ссылку на объект типа T. Он в основном используется для "подачи" ссылки на шаблоны функций (алгоритмы), которые принимают свой параметр по значению.

NB: Важное различие между boost :: reference_wrapper и std :: reference_wrapper (по крайней мере, Boost 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';
7
ответ дан 4 December 2019 в 20:22
поделиться

В 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
4
ответ дан 4 December 2019 в 20:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: