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

Joh*_*itb 6 c++ tuples c++11

这里(/sf/answers/2628546231/)用户@Barry在评论部分中注意到您可以使用,std::tuple<int[2]>并且显然不禁止实例化此类型.我还没有听说过这种野兽,我想知道它有什么用途,而不是int var[2]直接存储或使用它std::array<int, 2>.

据说,std::tuple<int[2]>不是可复制的,也不是可移动的,也不是可以复制的int var[2].它有什么其他用途?

小智 -1

我很确定这是未定义的行为。请参阅RequiresReturns子句:

tuple.creation-10 和 12说:

要求:对于所有iU i应为类型cv i ,其中 cv i是(可能为空)第 icv-qualifier-seq ,Args i是表示U i中元素类型的参数包。令 A ikArgs i中的第k类型。对于所有A ik都应满足以下要求: 如果Ti推导为左值引用类型,则,否则。tuple<Argsi...>is_constructible<Aik, cvi Aik&>::value == trueis_constructible<Aik, cvi Aik&&>::value == true

返回:对 每个有效的k i和每个组e i按顺序初始化e i ...中的第k i类型元素e iktuple构造的对象。get<ki>(std::forward<Ti>(tpi))

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

std::tuple<int[2]> t; // fine
std::tuple<int[2]> t{}; // fine
Run Code Online (Sandbox Code Playgroud)

尽管:

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

int main() {
   auto x = a();
   // ...
}
Run Code Online (Sandbox Code Playgroud)

给出如下错误:

error: array initializer must be an initializer list
        : _M_head_impl(std::forward<_UHead>(__h)) { }
Run Code Online (Sandbox Code Playgroud)