Non-Profit, International

Spirit unsterblich.

C++ std::reference_wrapper 和 std::ref

字数统计:329 blog

std::reference_wrapper 是 C++11 开始添加的一个类模板,作用是将引用包装为一般对象,使之可以当作普通对象来储存和传递,std::ref 是通过 std::reference_wrapper 实现的辅助函数,用于自动构建 std::reference_wrapper 临时对象。

之前的文章 C++ std::move 提到过函数模板 std::remove_reference 用于去除参数的引用,而 std::ref 1 则刚好与其相反。

std::thread 构造函数的第二个参数就是经过了 std::remove_reference 的处理,因为 std::thread 通常期望将传入的参数复制一份传递给 Callables,而引用在语义上不是一个真正的对象(在实现上,引用是可与其指向的对象进行区分的),仅仅作为原始对象的别名。

所以,如果希望将一个引用传递给 std::thread,那么就必须使用 std::reference_wrapper 2 构建一个可传递的引用,为了简便书写,可直接使用 std::ref 函数,std::ref 会将左值和左值引用统一为左值引用,然后将其装入 std::reference_wrapper,其使用方法和 std::move 类似。

注:

若无特殊声明,本文以 CC BY-SA 3.0 许可协议 提供。