【问题标题】:Constexpr operator newconstexpr 运算符 new
【发布时间】:2018-11-21 19:18:35
【问题描述】:

是否可以将 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 */ }
}

非常感谢任何愿意提供帮助的人!

【问题讨论】:

  • constexpr 不能有副作用,所以这会是矛盾的
  • 没有编译时动态内存分配这样的东西。根据定义,在编译时为程序分配内存只是指定运行时所需的静态内存量。如果您可以在编译时计算您的任务在运行时需要N 字节,那么只需有一个大小为N 的正确对齐的static 缓冲区。
  • 反正也没关系。 [expr.const] 全面禁止常量表达式中的new-expression
  • 你想看看 C++2a 论文试图让一切都变成 constexpr。

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


【解决方案1】:

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

constexpr 说明符仅适用于定义 变量或变量模板或函数的声明或 函数模板。用 constexpr 说明符隐式是内联函数或变量 (9.1.6)。 如果函数或函数模板的任何声明具有 constexpr 说明符,则其所有声明应包含 constexpr 说明符

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

【讨论】:

  • 我不能 100% 确定这是正确的。这不是在谈论同一函数(具有相同签名)的多个声明的情况吗?我真的不明白背后的理由,如果一个重载是constexpr,那么它们都必须是constexpr
  • 提到了哪个版本的标准?
猜你喜欢
  • 2011-05-24
  • 2013-06-05
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多