C++标准特别禁止调用new
常量表达式(N4296第5.20节[expr.const]):
条件表达式e是核心常量表达式,除非根据抽象机器(1.9)的规则评估e将评估以下表达式之一:
...
- 一个新表达式(5.3.4);
这项禁令(据我所知)延伸到所有形式new
,包括新的安置.但是,由于placement new实际上并没有分配任何内存,只是在给定位置运行构造函数,并且因为在constexpr
上下文中获取变量的地址是合法的(事实上,std::addressof
在C++ 17中将是constexpr),似乎对我来说,这个禁令(原则上至少)可以放宽,以允许在constexpr功能中放置新的禁令.
所以我的问题是,我错过了什么吗?有没有一个很好的理由为什么在constexpr
功能中禁止放置新的?
(对于上下文:当前规则几乎要求启用constexpr的sum类型std::variant
实现为递归联合.能够使用类似std::aligned_storage
和贴片new的东西会更好,但目前这是不可能的.)