为什么std :: make_tuple将std :: reference_wrapper <X>参数转换为X&?

Ral*_*zky 10 c++ tuples c++11 reference-wrapper

在C++ 11标准中,它指出(参见cppreference.com,另见标准的第20.4.2.4节)它指出

template< class... Types >
tuple<VTypes...> make_tuple( Types&&... args );
Run Code Online (Sandbox Code Playgroud)

创建一个元组对象,从参数类型中推导出目标类型.

对于每一个TiTypes...时,相应的类型ViVtypes...std::decay<Ti>::type除非的应用std::decay在结果中std::reference_wrapper<X>为某种类型的X,在这种情况下,推定的类型是X&.

我想知道:为什么参考包装器在这里处理特殊?

R. *_*des 11

这或多或少是主要目的reference_wrapper.

通常,std::make_tuple总是生成值的元组(std::decay模拟按值传递语义).给出int x, y; std::make_tuple(x, y);了一个std::tuple<int, int>,尽管它会被推断Types为一组参考文献int&, int&.std::decay转换为int, int.

reference_wrapper允许你强制创建引用元组:std::make_tuple(std::ref(x), y)将创建一个std::tuple<int&, int>.

标准库的其他部分reference_wrapper以相同的方式使用.例如,std::bind通常会将绑定参数复制/移动到结果对象中,但如果您希望它只存储引用,则可以通过传递一个来显式请求它reference_wrapper.