此处(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]
。它有什么其他用途?
答案 0 :(得分:-1)
我很确定这是未定义的行为。请参阅需要和返回子句:
需要:对于所有 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 ... withget<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)) { }