1

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

例子:

[[nodiscard]] void* allocateMemory();

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

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

4

1 回答 1

0

论文P0600R0建议应用于[[nodiscard]]库函数,并将全局operator new作为必须应用于的函数之一。
正如 TC 在评论中提到的,这无法使其符合 C++17 标准本身。还提交了一个名为[[nodiscard]]在库中”的错误。决定在以后的草案中采用这一点。

标准草案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);
于 2019-02-07T11:53:43.723 回答