Constexpr运算符new

时间:2018-11-21 19:18:36

标签: c++ c++17 constexpr if-constexpr

是否可以将新的运算符重载为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 */ }
}

在此先感谢任何愿意提供帮助的人!

1 个答案:

答案 0 :(得分:4)

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

  

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

也就是说,为了使运算符new重载,其所有先前的声明也必须为constexpr,它们不是,因此在constexpr中重载它会导致编译时错误