我可以使用像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>
这样的东西,我可能会遇到什么问题?也许这是一个太模糊的问题,但很难弄清楚为什么我不舒服,有些怀疑使用它为我的目的。
不,它会导致未定义的行为。
容器value_type
的must be Erasable from the container type,其中Erasable在[container.requirements.general] paragraph 15中定义:
给定一个分配器类型
A
并给出一个容器类型X
,其value_type
与T
相同,allocator_type
与allocator_traits<A>::rebind_alloc<T>
相同,并给出m
类型的左值A
,p
类型的指针T*
,类型(可能是v
)const
的表达式T
,和rv
类型的右值T
,定义了以下术语。如果X
不支持分配器,则下面的术语定义为A是allocator<T>
- 不需要创建分配器对象,并且不实例化allocator<T>
的用户专精:
- ...
T
是X
的可擦除意味着以下表达形式良好: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。