这里(/sf/answers/2628546231/)用户@Barry在评论部分中注意到您可以使用,std::tuple<int[2]>并且显然不禁止实例化此类型.我还没有听说过这种野兽,我想知道它有什么用途,而不是int var[2]直接存储或使用它std::array<int, 2>.
据说,std::tuple<int[2]>不是可复制的,也不是可移动的,也不是可以复制的int var[2].它有什么其他用途?
小智 -1
我很确定这是未定义的行为。请参阅Requires和Returns子句:
要求:对于所有i,U i应为类型cv i ,其中 cv i是(可能为空)第 i个cv-qualifier-seq ,Args i是表示U i中元素类型的参数包。令 A ik为Args 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 ik
tuple构造的对象。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)
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |