8

添加了C++17[[nodiscard]]

C++20增加了[[nodiscard]]onempty方法的使用,例如——也许是为了避免用户与 clear 方法混淆(即意外调用empty()以清除向量)。vector::empty()

为什么 C++20 不利用这个机会添加[[nodiscard]]unique_ptr::release?


是否存在一个有效合理的场景,在这种场景下,人们会在unique_ptr::release不获取返回值的情况下进行调用?


以同样的方式避免用户混淆(如果这是添加方法的原因[[nodiscard]]empty- 名称release总是非常令人困惑,听起来,嗯......这里会发布一些东西。

在某种程度上,添加[[nodiscard]]可以解决这个名称问题。

4

3 回答 3

7

这在添加[[nodiscard]]到许多功能的论文中得到了解决。从P0600R1这是关于添加[[nodiscard]]unique_ptr::release()

Titus:在谷歌,3.5% 的调用会失败,但分析表明这是正确的(但所有权语义很奇怪)。请参阅反射器电子邮件。

于 2020-03-04T22:17:09.020 回答
2
// returns true on success
bool run_a_thing(void (*)(void*), void* context);

struct state {
    // whatever
};

void runner(void* context) {
    std::unique_ptr<state> s(static_cast<state*>(context));
    // do things
}

void run_thing() {
    auto s = std::make_unique<state>(....);
    if (run_a_thing(runner, s.get())) {
        s.release();
    }
}

这基本上是 libstdc++ 的结构std::threadrun_a_thingpthread_create

于 2020-03-04T23:32:25.040 回答
2

因为您之前已经检索了指针值并使用它完成了一些工作。

简单近似:

unique_ptr<someclass> ptr;
// ...
someclass *s = ptr.get();
if (s->are_we_there_yet()) {
    ptr.release();
    // finish up with s...
    s->close_garage_door();
    delete s;
}
于 2020-03-04T22:09:19.753 回答