【发布时间】:2022-10-08 17:55:44
【问题描述】:
表达式 E 是核心常量表达式,除非 E 的评估遵循抽象机 ([intro.execution]) 的规则,将评估以下之一:
- new 表达式 ([expr.new]),除非选定的分配函数是可替换的全局分配函数 ([new.delete.single], [new.delete.array]) 并且分配的存储在E的评价;
Placement-new 表达式不是常量表达式。
为了解决这个问题,C++20 添加了
std::construct_at。那么为什么不能将placement-new 表达式设为常量表达式呢?
【问题讨论】:
-
可能是因为编译器要实现它并非易事。使用当前规则,您不必将内存与在其中创建的对象分开跟踪。无法更改存储在内存位置的类型。如果您通常允许放置新,那么您需要明确跟踪内存,以及在任何给定时间位于其中的不同对象。验证对象生命周期规则也可能变得更加复杂。
-
@cigien 这个问题适用于 C++20。既然
std::construct_at可以是常量表达式,那为什么不能是placement-new 表达式呢? -
打赌一下:
std::construct_at作为新放置的更具表现力和可读性的界面,后者可能“在道德上被弃用”。要求placement new 为 constexpr 会有额外的负担——取决于编译器的实现;如果无论如何都不再使用它,那么要求进行更改是没有意义的。
标签: c++ c++20 placement-new constant-expression