C++20 P0784R7 Non-transient allocation too brittle vs. P1004R2 constexpr std::vector(C++20 P0784R7非瞬时分配太脆弱vs.P1004R2常量表达式std::VECTOR)
问题描述
我想在C++20中创建一个广泛的constexpr数据存储库。数以万计的本机C++对象作为&q;文本段&即请求分页加载到进程中并在实例之间共享(生成代码)。
对象相互引用,需要通过各种属性、交叉引用等进行索引,所有这些都希望在编译时完成。这需要constexpr(关联)容器,但不能使用模板化(按大小、散列大小等)完成。容器,因为一切都需要保持多态。
首先这似乎是不可能的,因为C++20P0784R7认为非瞬时分配太脆弱,即动态分配的内存不允许从constexpr计算中泄漏出来。
同时C++20P1004R2表示要支持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这两个能力在计算上是否等价,是否需要实现非暂态分配,因此也可以提供?
编译器最终何时支持它? ..。或者,这一可疑的矛盾甚至是推迟的原因?
推荐答案
您对临时分配有误解。临时分配是指在常量计算内完全存在的分配。例如:
constexpr std::size_t summation(std::vector<unsigned int> const &vi)
{
  std::size_t ret = 0;
  for(auto i : vi)
    ret += i;
  return ret;
}
constexpr auto sum = summation({20, 44, 98});
在summation调用中,最终的输入源(带括号的init-list及其值)在编译时是完全已知的。是的,有一个vector,但它完全存在于常量表达式计算中。vector对象用于计算常量值,但vector本身从不留下常量表达式代码。
这篇关于C++20 P0784R7非瞬时分配太脆弱vs.P1004R2常量表达式std::VECTOR的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:C++20 P0784R7非瞬时分配太脆弱vs.P1004R2常量表达式std::VECTOR
				
        
 
            
        基础教程推荐
- C++结构和函数声明。为什么它不能编译? 2022-11-07
 - 常量变量在标题中不起作用 2021-01-01
 - 在 C++ 中计算滚动/移动平均值 2021-01-01
 - 如何通过C程序打开命令提示符Cmd 2022-12-09
 - 如何在 C++ 中初始化静态常量成员? 2022-01-01
 - 这个宏可以转换成函数吗? 2022-01-01
 - 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
 - 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
 - 我有静态或动态 boost 库吗? 2021-01-01
 - 如何检查GTK+3.0中的小部件类型? 2022-11-30
 
    	
    	
    	
    	
    	
    	
    	
    	
						
						
						
						
						
				
				
				
				