C++标准特别禁止在常量表达式中调用new (N4296第5.20节expr.const):
条件表达式e是核心常量表达式,除非e的计算遵循抽象机器(1.9)的规则计算下列表达式之一: ..。 -新的-表达(5.3.4);
这项禁令(据我所知)扩展到所有形式的new,包括新的安置。但是,由于location实际上并没有分配任何内存,只是在给定的位置运行构造函数,而且由于在constexpr上下文中获取变量的地址是合法的(实际上,std::addressof将在C++17中保持不变),在我看来,这一禁令(至少在原则上是如此)可以放宽,以允许将新的位置放置在C++17函数中。
所以我的问题是,我是不是遗漏了什么?在constexpr函数中禁止放置新的位置有充分的理由吗?
(对于上下文:当前的规则几乎要求启用std::variant等启用常数的求和类型作为递归联合实现。如果能够使用std::aligned_storage之类的东西来安置新的东西会更好,但目前这是不可能的。)
发布于 2020-04-18 14:15:18
新位置并不能很好地与当前的constexpr世界相结合,因为它允许构建一个具有其底层字节表示(值初始化)的对象。这一点在标准中没有定义(两个补码甚至不是在警察中,作为提醒)。
看一看C++标准讨论,它还可以允许随后查看对象类型表示(因为您仍然持有字节数组)。
发布于 2018-04-25 17:46:35
没有任何概念上的原因,安置新的不能工作。我认为这是一种疏忽,新位置基本上只是对预定义内存位置中的构造函数的调用。
确保新参数具有有效的参数位置与确保对随机指针的写入是有效的并不难。
https://stackoverflow.com/questions/41580022
复制相似问题