10

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

template< class... Types >
tuple<VTypes...> make_tuple( Types&&... args );

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

对于每个Tiin Types...,对应的类型ViinVtypes...std::decay<Ti>::type,除非应用std::decay结果 instd::reference_wrapper<X>某些类型X,在这种情况下,推导的类型是X&

我想知道:为什么参考包装在这里被特殊对待?

4

3 回答 3

11

这或多或少是reference_wrapper.

通常,std::make_tuple总是生成的元组(std::decay模拟按值传递的语义)。Givenint 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.

于 2013-09-27T15:21:48.577 回答
4

您的标题具有误导性:使用std::reference_wrapper<X>将成员变为X&而不是X. 完成此转换的原因是std::reference_wrapper<T>辅助类型,旨在将值类型转换为引用类型。但是,使其显示为这种方式所需的额外转换有时会干扰使用。因此,在可能的情况下展开引用似乎是一种合理的方法:使std::tuple<...>成员 aT&使使用更加自然。

于 2013-09-27T15:23:16.067 回答
0

人们通常std::reference_wrapper<X>用来保存不可复制的类型。因此,复制它们make_tuple会达到目的(如果复制构造函数被删除,可能会破坏构建)。这就是它在返回类型中使用引用(而不是值)的原因。

于 2013-09-27T16:22:51.193 回答