我可以使用std::array<int[2][2], 2>
之类的内容替代int[2][2][2]
,就像使用std::array<int, 2>
代替int[2]
一样吗?
我真正需要的是一个静态大小的多维数组
似乎与C风格的数组不同,std::array
的{{1}}不能保证具有完全紧凑的内存,因为std::array
可能包含填充。
如果我使用std::array
之类的内容,可能会遇到哪些问题?也许这是一个过于模糊的问题,但很难弄清楚为什么我不舒服并且有点怀疑它是否符合我的目的。
答案 0 :(得分:3)
不,它会导致未定义的行为。
容器must be Erasable from the container type的value_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
{ {1}}以及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。