为什么新的运算符不被声明为[[nodiscard]]?

时间:2017-10-15 02:00:14

标签: c++ c++17

C ++ 17在p0189r1中引入了新属性[[nodiscard]]。使用此属性修饰函数时,不得丢弃返回类型。如果丢弃,则会发出警告。

示例:

[[nodiscard]] void* allocateMemory();

void doWork() {
    allocateMemory(); // Warning is emitted, because the value is not stored in a variable and thus is discarded
}

对于任何返回以后必须再次释放/销毁/删除/ ...的任何函数来说,这似乎是一个很好的补充。但是,该标准没有改变全局新运算符的定义来使用这个新的注释。这有什么好的理由吗?

1 个答案:

答案 0 :(得分:0)

论文P0600R0建议将[[nodiscard]]应用于库函数,并列举全局operator new作为它必须应用于的函数之一。
正如TC在评论中提到的那样,这无法使其符合C ++ 17标准。还提交了一个标题为"[[nodiscard]] in the Library"的错误。决定将其纳入以后的草案中。

标准草案 n4713 包含了此更改。

  

6.6.4.4动态存储持续时间[basic.stc.dynamic]
  ...
  2. ...在程序的每个翻译单元中,以下分配和释放函数在全局范围中隐式声明。

[[nodiscard]] void* operator new(std::size_t);
[[nodiscard]] void* operator new(std::size_t, std::align_val_t);