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