为什么 unique_ptr::release 没有用 [[nodiscard]] 定义?
Why is unique_ptr::release not defined with [[nodiscard]]?
C++17 添加了 [[nodiscard]]
.
C++20 在 empty
方法上添加了 [[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::thread
。 run_a_thing
是 pthread_create
.
C++17 添加了 [[nodiscard]]
.
C++20 在 empty
方法上添加了 [[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::thread
。 run_a_thing
是 pthread_create
.