【问题标题】:What's the use of `std::tuple<int[N]>`?`std::tuple<int[N]>` 有什么用?
【发布时间】:2016-10-01 00:11:09
【问题描述】:

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

据报道,std::tuple&lt;int[2]&gt; 不可复制,既不可移动也不可从int var[2] 构造。它还有什么其他用途?

【问题讨论】:

  • 这是一种用 int[2] 元素表示类型列表的好方法。
  • 这是巴里的私人问题吗? :) 在不那么开玩笑的模式下,我认为,当元组的实际参数数量未知时,它可以使用,并且单个数组是一个特殊情况?
  • @SergeyA 这是社区的一个问题,也许有一个很好的理由允许这样做?
  • @JohannesSchaub-litb,允许还是使用?这是允许的,因为它属于一般规则。没有什么可以禁止的。但使用它是另一个问题。
  • std::tuple&lt;X&gt; 什么时候最好用X 代替?关于为什么不 int var[2] 的问题似乎是一个可怜的问题,它分散了你其他问题的注意力,不是吗?

标签: c++ c++11 tuples


【解决方案1】:

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

tuple.creation-10 and 12 说:

要求: 对于所有 iUi 应为 cv 类型我 tuple&lt;<em>Args<sub>i</sub>...</em>&gt;,在哪里 cvi 是(可能为空)ith cv-qualifier-seq 和 Argsi 是参数包 表示 Ui 中的元素类型。让 AikArgskith 类型>我。对于所有 Aik 应满足以下要求: 如果将 Ti 推导出为 左值引用类型,则为is_constructible&lt;<em>A<sub>ik</sub></em>, <em>cv<sub>i</sub></em> <em>A<sub>ik</sub></em>&amp;&gt;::value == true,否则为is_constructible&lt;<em>A<sub>ik</sub></em>, <em>cv<sub>i</sub></em> <em>A<sub>ik</sub></em>&amp;&amp;&gt;::value == true

返回:通过初始化kith类型元素构造的tuple对象 eikei...get&lt;<em>k<sub>i</sub></em>&gt;(std::forward&lt;<em>T<sub>i</sub></em>&gt;(<em>tp<sub>i</sub></em>)) 对于每个有效的 ki 和每个组 ei 顺序。

就像 Barry 所说,没有什么可以阻止 std::tuple&lt;int[2]&gt; 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)) { }

【讨论】:

  • that requires 子句仅适用于tuple_cat
  • 人们在没有事实检查的情况下格式化标准语所付出的努力令人惊叹。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 2021-02-24
  • 2014-08-31
  • 1970-01-01
相关资源
最近更新 更多