boost::ref(i)
和& i
之间有什么区别?我们不能使用常规引用而必须转而使用boost::ref
的情况是什么?如果可能,请提供示例。
答案 0 :(得分:7)
目的 boost :: reference_wrapper是 包含对象的引用 类型T.它主要用于“喂” 对函数模板的引用 (算法)采取他们的参数 按价值。
注意: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';
答案 1 :(得分:4)
例如在Boost.Thread中:
通过传递一个新线程 可调用类型的对象 没有参数调用 构造函数。然后复制该对象 进入内部存储,并调用 新创建的执行线程。 如果对象不能(或不能) 复制,然后 boost :: ref 可用于 传递对函数的引用 宾语。在这种情况下,用户 Boost.Thread必须确保 被提及的对象超过了 新创建的执行线程。
来自doc的代码:
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