拥有一个C风格数组的std ::数组是否合法?

时间:2018-03-03 14:02:30

标签: c++ arrays

我可以使用std::array<int[2][2], 2>之类的内容替代int[2][2][2],就像使用std::array<int, 2>代替int[2]一样吗?

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

  1. 具有“正确”的价值语义,
  2. 连续存储在内存中。
  3. 似乎与C风格的数组不同,std::array的{​​{1}}不能保证具有完全紧凑的内存,因为std::array可能包含填充。

    如果我使用std::array之类的内容,可能会遇到哪些问题?也许这是一个过于模糊的问题,但很难弄清楚为什么我不舒服并且有点怀疑它是否符合我的目的。

1 个答案:

答案 0 :(得分:3)

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

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

  

给定分配器类型A并给出容器类型X,其value_­typeT相同且allocator_­typeallocator_­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