gpt4 book ai didi

c++ - 为什么不将 [[nodiscard]] 应用于每个构造函数?

转载 作者:行者123 更新时间:2023-12-04 12:27:49 25 4
gpt4 key购买 nike

从 C++20 开始,[[nodiscard]]可以应用于构造函数。 http://wg21.link/p1771有例子:

struct [[nodiscard]] my_scopeguard { /* ... */ };
struct my_unique {
my_unique() = default; // does not acquire resource
[[nodiscard]] my_unique(int fd) { /* ... */ } // acquires resource
~my_unique() noexcept { /* ... */ } // releases resource, if any
/* ... */
};
struct [[nodiscard]] error_info { /* ... */ };
error_info enable_missile_safety_mode();
void launch_missiles();
void test_missiles() {
my_scopeguard(); // warning encouraged
(void)my_scopeguard(), // warning not encouraged, cast to void
launch_missiles(); // comma operator, statement continues
my_unique(42); // warning encouraged
my_unique(); // warning not encouraged
enable_missile_safety_mode(); // warning encouraged
launch_missiles();
}
error_info &foo();
void f() { foo(); } // warning not encouraged: not a nodiscard call, because neither
// the (reference) return type nor the function is declared nodiscard
通常构造函数没有副作用。所以丢弃结果是没有意义的。例如,丢弃 std::vector如下毫无意义:
std::vector{1,0,1,0,1,1,0,0};
如果 std::vector 会很有用构造函数是 [[nodiscard]] ,这样上面的代码就产生了警告。
确实有副作用的著名构造函数是锁构造函数,例如 unique_locklock_guard .但是那些被标记为 [[nodiscard]] 的好目标同样,为了避免错过范围,例如:
std::lock_guard{Mutex};
InterThreadVariable = value; // ouch, not protected by mutex
如果 std::lock_guard 会很有用构造函数是 [[nodiscard]] ,这样上面的代码就产生了警告。
当然有这样的案例 return std::lock_guard{Mutex}, InterThreadVariable; .但很少见还有 [[nodiscard]]守卫,并像 return ((void)std::lock_guard{Mutex}, InterThreadVariable);一样在本地压制它们
所以, 有没有什么情况下构造函数不应该被丢弃?

最佳答案

来自 pybind11 的示例库:要为 python 包装一个 C++ 类,你可以:

PYBIND11_MODULE(example, m) {
py::class_<MyClass>(m, "MyClass"); // <-- discarded.
}

关于c++ - 为什么不将 [[nodiscard]] 应用于每个构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69241721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com