[[nodiscard]] C++17
[[nodiscard]] 属性详解
1. 基本概念
[[nodiscard]]
是 C++17 引入的一个属性(attribute),用来标记不应该被忽略的返回值。
2. 作用
- 当函数的返回值被忽略时,编译器会发出警告
- 帮助防止程序员意外丢弃重要的返回值
- 提高代码的安全性和可靠性
3. 使用场景
3.1 普通函数示例
// 编译器会警告如果返回值被忽略
[[nodiscard]] int getValue() {
return 42;
}
int main() {
getValue(); // 警告:返回值被忽略
int x = getValue(); // 正确:返回值被使用
}
3.2 在 IsolateManager 中的用法
template <typename Runnable>
[[nodiscard]] auto Run(Runnable runnable)
-> typename IsolateTask<Runnable>::FutureType;
// 错误用法(会收到警告):
manager.Run(task); // 警告:future 被忽略!
// 正确用法:
auto future = manager.Run(task); // 正确:保存了 future
4. 为什么在 IsolateManager 中使用?
- Run 方法返回一个 future(未来值)
- 这个 future 用于获取任务的执行结果
- 如果忽略这个返回值,就无法知道任务是否完成
- 也无法获取任务的执行结果
5. 实际例子
IsolateManager manager(platform);
// 错误示例 ❌
manager.Run([](v8::Isolate* isolate) {
return "结果";
}); // 编译警告:忽略了返回的 future
// 正确示例 ✅
auto future = manager.Run([](v8::Isolate* isolate) {
return "结果";
});
auto result = future.get(); // 获取结果
简单来说,`[[nodiscard]]` 就是告诉编译器:"嘿,这个返回值很重要,不能随便丢弃!如果有人忽略了这个返回值,请发出警告。"
这在异步编程中特别重要,因为如果忽略了 future,就可能导致任务的结果永远无法获取,或者任务的完成状态无法追踪。