5

是否可以将 operator 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

1 回答 1

4

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

说明constexpr符应仅应用于变量或变量模板的定义或函数或函数模板的声明。使用说明符声明的函数或静态数据成员 constexpr隐含地是内联函数或变量 (9.1.6)。如果函数或函数模板的任何声明具有 constexpr说明符,则其所有声明都应包含说明 constexpr

也就是说,为了重载 operator,new它之前的所有声明也必须是constexpr,它们不是,因此在constexpr你得到编译时错误时重载它。

于 2018-11-21T19:58:13.023 回答