拥有一个C样式数组的std ::数组是否合法?

Jun*_*eon 7 c++ arrays

我可以使用类似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>?也许这是一个太模糊的问题,但很难弄清楚为什么我不舒服,有些怀疑使用它为我的目的.

xsk*_*xzr 3

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

\n

value_type容器的必须是容器类型中的Erasable ,其中 Erasable 在[container.requirements.general] 第 15 段中定义:

\n
\n

给定一个分配器类型A,给定X一个具有value_\xc2\xadtypeTallocator_\xc2\xadtype相同的容器类型,allocator_\xc2\xadtraits<A>\xe2\x80\x8b::\xe2\x80\x8brebind_\xc2\xadalloc<T>并给定一个m类型为 的左值、一个类型为 的A指针、一个类型为 的表达式(可能)和一个类型为 的右值,定义以下术语。如果不是分配器感知,则以下术语定义为如果 A 为\xe2\x80\x94,则不需要创建分配器对象,并且不实例化用户特化:pT*vconstTrvTXallocator<T>allocator<T>

\n
    \n
  • ...

    \n
  • \n
  • Tis Erasable fromX表示以下表达式格式良好:\nallocator_traits<A>::destroy(m, p)

    \n
  • \n
\n
\n

因为std::array它不知道分配器,所以我们需要检查是否allocator_traits<allocator<int[2][2]>>::destroy(m, p)格式良好。

\n

由于std::allocator没有成员函数destroy(在 C++17 中已弃用),std::allocator_traits::destroy因此将直接调用 的(伪)析构函数int[2][2]。这是格式错误的,因为int[2][2]不是标量类型

\n

  • 在我看来,这是一个缺陷。您无法删除“std::array”的成员,因为它是一个聚合。它根本不使用分配器。 (6认同)