什么是`std :: tuple <int [n]>`的用法?

时间:2016-06-01 14:39:14

标签: c++ c++11 tuples

此处(https://stackoverflow.com/a/37550660/34509)用户@Barry注释在评论部分中您可以使用std::tuple<int[2]>并且显然不会禁止实例化此类型。我还没有听说过这个野兽,我想知道它有什么用途,而不是直接存储int var[2]或使用std::array<int, 2>

据报道,std::tuple<int[2]>不可复制,既不可移动也不可构建int var[2]。它有什么其他用途?

1 个答案:

答案 0 :(得分:-1)

我很确定这是未定义的行为。请参阅需要返回子句:

tuple.creation-10 and 12说:

  

需要:对于所有 i U i 应为 cv 类型我 tuple<Argsi...>,在哪里    cv i 是(可能是空的) i th cv-qualifier-seq和 Args i 是参数包   表示 U i 中的元素类型。让    A ik Args k i th 类型> I 的。对于所有 A ik ,应满足以下要求:如果 T i 被推断为   左值引用类型,然后是is_constructible<Aik, cvi Aik&>::value == true,否则为is_constructible<Aik, cvi Aik&&>::value == true

     

返回:通过初始化 k i th 类型元素构建的tuple对象< em> e ik in e i ... with get<ki>(std::forward<Ti>(tpi))   对于每个有效的 k i 和每个组 e i in   顺序。

就像巴里所说,没有什么可以阻止std::tuple<int[2]> t;但是尝试对它做任何事情都可能导致编译器出现硬错误。例如:

std::tuple<int[2]> t; // fine
std::tuple<int[2]> t{}; // fine

虽然:

std::tuple<int[2]> a() {
  int a[2] = { 1, 2};
  return std::tuple<int[2]>(a);
}

int main() {
   auto x = a();
   // ...
}

给出如下错误:

error: array initializer must be an initializer list
        : _M_head_impl(std::forward<_UHead>(__h)) { }