gpt4 book ai didi

c++ - 拥有 C 风格数组的 std::array 是否合法?

转载 作者:可可西里 更新时间:2023-11-01 18:38:14 24 4
gpt4 key购买 nike

我可以使用类似 std::array<int[2][2], 2> 的东西吗?作为 int[2][2][2] 的替代品, 就像 std::array<int, 2>可以用来代替 int[2]

我真正需要的可能是一个静态大小的多维数组

  1. 具有“适当的”值语义,并且
  2. 在内存中连续存储。

看来,与 C 风格的数组不同,std::arraystd::array不保证具有完全压缩的内存,如std::array可能包含填充。

如果我使用像 std::array<int[2][2], 2> 这样的东西,我可能会遇到什么问题? ?也许这是一个过于模糊的问题,但很难弄清楚为什么我对将它用于我的目的感到不舒服并且有些怀疑。

最佳答案

不,它会导致未定义的行为。

value_type容器 must be Erasable from the container type ,其中 Erasable 在 [container.requirements.general] paragraph 15 中定义:

Given an allocator type A and given a container type X having a value_­type identical to T and an allocator_­type identical to allocator_­traits<A>​::​rebind_­alloc<T> and given an lvalue m of type A, a pointer p of type T*, an expression v of type (possibly const) T, and an rvalue rv of type T, the following terms are defined. If X is not allocator-aware, the terms below are defined as if A were allocator<T> — no allocator object needs to be created and user specializations of allocator<T> are not instantiated:

  • ...

  • T is Erasable from X means that the following expression is well-formed:allocator_traits<A>::destroy(m, p)

因为 std::array不是分配器感知的,我们需要检查是否 allocator_traits<allocator<int[2][2]>>::destroy(m, p)结构良好。

std::allocator 没有成员函数destroy (在 C++17 中已弃用), std::allocator_traits::destroy 会调用 int[2][2] 的(伪)析构函数直接地。这is ill-formed因为int[2][2]不是 scalar type .

关于c++ - 拥有 C 风格数组的 std::array 是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49084951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com