函数模板
<tuple>

std::forward_as_tuple

template<class... Types>  tuple<Types&&...> forward_as_tuple (Types&&... args) noexcept;
template<class... Types>  constexpr tuple<Types&&...> forward_as_tuple (Types&&... args) noexcept;
前向转为元组
构造一个 tuple 对象,其元素为 args右值引用,适用于将它们作为参数转发给函数。

此函数旨在转发参数,而不是将其结果存储在命名变量中,因为返回的对象可能包含对临时变量的引用。

它等效于
1
2
3
4
5
template<class... Types>
  tuple<Types&&...> forward_as_tuple (Types&&... args) noexcept
{
  return tuple<Types&&...>(std::forward<Types>(args)...);
}

参数

args
要作为 tuple 对象转发的元素的列表,其中包含引用。

返回值

一个 tuple 对象,其中包含 args右值引用,适用于将它们作为参数转发给函数。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// forward_as_tuple example
#include <iostream>     // std::cout
#include <tuple>        // std::tuple, std::get, std::forward_as_tuple
#include <string>       // std::string

void print_pack (std::tuple<std::string&&,int&&> pack) {
  std::cout << std::get<0>(pack) << ", " << std::get<1>(pack) << '\n';
}

int main() {
  std::string str ("John");
  print_pack (std::forward_as_tuple(str+" Smith",25));
  print_pack (std::forward_as_tuple(str+" Daniels",22));
  return 0;
}

输出
John Smith, 25
John Daniels, 22


数据竞争

此调用未引入任何内容。
请注意,如果 Types 中的任何类型支持移动语义或为左值引用,则其相应的 args 参数可能会被转发此函数返回的值的函数所修改。

异常安全

无异常保证:此函数从不抛出异常。

另见