Constexpr operator new

5

能否将重载运算符new变成constexpr函数?像这样:

constexpr void * operator new( std::size_t count );

这样做的原因是在重载运算符的函数体内执行constexpr函数,其中count参数值将作为输入数据...由于该运算符是通过以下方式调用的:

SomeClass * foo = new SomeClass(); 

数据类型的大小在编译时就已知,对吧?(count == sizeof(SomeClass))所以,可以将计数视为编译时常量吗?
constexpr void * operator new( std::size_t count )
{
  if constexpr ( count >= 10 ) { /* do some compile-time business */ }
}

提前感谢任何愿意帮助的人!

4
constexpr 不能具有副作用,因此这将是自相矛盾的。 - OznOg
4
在编译时动态内存分配是不存在的。在编译时为程序分配内存,实际上就是指定运行时所需的静态内存数量。如果您可以在编译时计算出在运行时需要 N 字节的内存,则只需具有正确对齐且大小为 N 的静态缓冲区即可。请注意,这个过程并不会改变原来的意思。 - François Andrieux
5
无论如何都没关系。[expr.const]完全禁止在常量表达式中使用new-expression - T.C.
6
您希望查看关于将所有内容都变成constexpr的C++2a论文。 - Marc Glisse
1
@FrançoisAndrieux 请阅读此文:http://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p0784r1.html - Oliv
显示剩余7条评论
1个回答

4
您不能将运算符new重载为constexpr,主要问题归因于C++标准指令§9.1.5/1 The constexpr specifier [dcl.constexpr] (Emphasis Mine):

constexpr关键字只能用于变量或变量模板的定义,或函数或函数模板的声明。使用constexpr关键字声明的函数或静态数据成员隐式地成为内联函数或变量(9.1.6)。如果任何一个函数或函数模板的声明具有constexpr关键字,则所有声明都必须包含constexpr关键字

也就是说,为了重载运算符new,它之前的所有声明都必须是constexpr,而它们不是,因此将其作为constexpr重载会导致编译时错误。


1
我不确定这是否正确。这是不是在讨论同一函数(具有相同的签名)有多个声明的情况?如果其中一个重载是constexpr,那么所有重载都必须也是constexpr,我真的看不出背后的理论依据。 - geza
提到了哪个标准版本? - Sergei Krivonos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接