我可以使用类似std::array<int[2][2], 2>替代品的东西int[2][2][2],就像std::array<int, 2>可以用来代替int[2]吗?
我真正需要的可能是一个静态大小的多维数组
看来,这与C风格的数组,std::array中std::array不能保证有充分紧凑化存储,因为std::array可能含有填充.
如果我使用类似的东西,可能会遇到什么问题std::array<int[2][2], 2>?也许这是一个太模糊的问题,但很难弄清楚为什么我不舒服,有些怀疑使用它为我的目的.
不,它会导致未定义的行为。
\nvalue_type容器的必须是容器类型中的Erasable ,其中 Erasable 在[container.requirements.general] 第 15 段中定义:
\n\n给定一个分配器类型
\nA,给定X一个具有value_\xc2\xadtype与T和allocator_\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- \n
\n
Tis Erasable fromX表示以下表达式格式良好:\nallocator_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]。这是格式错误的,因为int[2][2]不是标量类型。