【发布时间】:2021-02-16 09:49:11
【问题描述】:
我想在 C++20 中创建一个广泛的 constexpr 数据存储库。数以万计的原生 C++ 对象作为“文本段”加载,即需求分页到进程中并在实例之间共享(生成代码)。
对象相互引用,需要通过各种属性进行索引、交叉引用等。所有这些都希望在编译时完成。这需要constexpr(关联)容器,但不能使用模板化(按大小、哈希大小等)容器来完成,因为一切都需要保持多态性。
首先这似乎是不可能的,因为 C++20 P0784R7 说非瞬态分配太脆弱,即不允许动态分配的内存从 constexpr 评估中泄漏出来。
同时 C++20 P1004R2 表示要支持 constexpr std::vector。在后一篇论文中,我看到了所有成员,包括标记为constexpr 的修改成员。因此,除非我遗漏了什么,否则我可以在 constexpr 评估中向 std::vectors 添加元素(编译器还不支持它,所以我无法尝试)。
// 21.3.11.5, modifiers
template<class... Args> constexpr reference emplace_back(Args&&... args);
constexpr void push_back(const T& x);
constexpr void push_back(T&& x);
...
但是为什么我不能围绕std::vector<T> 构建一个allocator<T> 并且仍然有非瞬态分配?这两个功能不是“计算等效”,即constexpr std::vector需要实现非瞬态分配,因此它也可以提供它?
编译器何时最终支持它? ……或者这种可疑的矛盾甚至是延迟的原因?
【问题讨论】:
标签: c++ stdvector constexpr c++20