【问题标题】:Default initialization in constexpr with std::allocator在 constexpr 中使用 std::allocator 进行默认初始化
【发布时间】:2020-06-20 23:05:42
【问题描述】:

首先,我使用裸new/delete 实现了一个具有constexpr 能力的伪容器。然后我将它重构为使用 std::allocator 来实现它的所有优点。在这样做的过程中,我发现没有办法实现constexpruninitialized_default_construct,因为你不能在constexpr 中使用放置new,C++20 标准中也没有任何具有等效效果的东西还有constexpr

如果不对容器的实现进行重大更改以支持constexpr 中的默认初始化,有没有办法解决这个问题?除了写一篇论文来制作uninitialized_default_constructconstexpr 或介绍类似于construct_atdefault_construct_at 之类的东西?

【问题讨论】:

    标签: c++ c++20


    【解决方案1】:

    如果您想在constexpr 中进行默认初始化并且您的容器是固定大小的,请使用裸new。这意味着使用delete[] 而不是std::allocator.deallocate 后跟std::destroy。您仍然可以拆分分配和构造,但请注意在构造完成之前初始化所有元素,以避免delete[] 尝试破坏未初始化内存中的对象。

    对于非固定大小的容器,std 的支持是必要的,正如问题中所述。

    【讨论】:

    • 虽然我的问题特别提到了std::allocator,但如果我想支持Cpp17Allocators,我想知道这个答案是否足够好。似乎std::allocator_traits 原样,Cpp17Allocator 可以支持值初始化或默认初始化。在不更改 std 的情况下,需要像 uses_allocator 这样的间接机制来支持两者。
    • 刚刚提交了 GCC 错误 95797,因为如果不将所有 std::allocator.deallocate()s 和随附的 std::destroys 替换为 delete [],我认为这不会起作用。
    • 上面有一个问题,你不能支持增长容器的空间,因为delete []会尝试删除未初始化内存中的对象。这不是一个通用的解决方案。看起来像问题中建议的那样写一篇论文是唯一的方法。
    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多