是否允许std :: variant为其成员分配内存?

bit*_*ask 19 c++ variant dynamic-memory-allocation c++17

我想知道一个实现是否std::variant必须"平坦"或是否允许为其成员动态分配内存,这样一系列变体会退化为一系列指针,从而破坏缓存局部性.

Bar*_*rry 23

不,非常明确.来自[variant.variant]:

variant任何给定时间的任何实例都保存其替代类型之一的值,或者它没有值.当一个实例variant保存一个替代类型的值时T,它意味着T在该对象的存储中分配一个类型的值,称为变量对象的包含variant.不允许实现使用额外的存储(例如动态内存)来分配包含的值.所包含的值应分配在variant适合所有类型的存储区域中Types....实现定义是否支持过度对齐类型.

  • 包含向量的变量没有进行任何动态分配,向量是.它与变体中的指针类型没有什么不同 - 您可以在那里存储指向动态内存的指针.@ 0x5453 (4认同)
  • @NicolBolas FWIW,`tuple` 确实 [require](https://timsong-cpp.github.io/cppwp/tuple#cnstr-2) *对于每个元组构造函数,仅当构造其中之一时才会抛出异常Types 中的类型抛出异常。* AFAIK,这意味着它不能动态分配。 (3认同)
  • @ 0x5453呃,不是吗?这绝对是允许的.这种限制没有任何意义,也不具有可执行性.由于[this](/sf/ask/3255447121/),Clang拒绝了它. (2认同)

bit*_*ask 6

根据cppreference ::std::variant一定不能分配动态内存.

与联合一样,如果变量保存某个对象类型T的值,则T 的对象表示直接在变体本身的对象表示内分配.Variant不允许分配额外的(动态)内存.

  • @Incomputable我非常不同意.这是一个非常有效的问题,答案非常好.您不需要始终引用标准. (5认同)
  • 我同意我应该直接从标准中得到答案,而不是cppreference.但我认为cppreference和标准一样好(并且更容易导航). (2认同)