为什么 unique_ptr::release 没有用 [[nodiscard]] 定义?

Why is unique_ptr::release not defined with [[nodiscard]]?

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

C++20empty 方法上添加了 [[nodiscard]] 的使用,例如vector::empty() -- 也许, 避免用户混淆方法 clear(即调用 empty() 意外到 清除 向量)。

为什么 C++20 没有利用这个机会将 [[nodiscard]] 添加到 unique_ptr::release


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


以同样的方式避免用户混淆(如果这是将 [[nodiscard]] 添加到 empty 方法的原因)——名称 release 总是很混乱,听起来像,嗯……这里要放东西。

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

因为您之前已经检索了指针值并对其进行了处理。

简单近似:

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;
}

在向许多函数添加 [[nodiscard]] 的论文中解决了这个问题。从 P0600R1 这是关于将 [[nodiscard]] 添加到 unique_ptr::release()

的注释

Titus: at Google 3.5% of calls would fail, but analysis showed that it was correct (but weird ownership semantics). See reflector email.

// 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.