[[nodiscard]]用于提示编译器函数返回值不应被忽略,C++17起支持,C++20可添加说明文字,常用于错误码、资源管理等场景以提升代码安全性。
![c++怎么使用[[nodiscard]]等属性_c++ [[nodiscard]]属性使用方法](https://img.php.cn/upload/article/001/431/639/175903656220710.png)
[[nodiscard]] 是 C++17 引入的一个属性(attribute),用于提示编译器:某个函数的返回值不应被忽略。如果调用者忽略了带有 [[nodiscard]] 的函数的返回值,编译器会发出警告。这个特性有助于避免潜在的编程错误,比如忘记检查错误码或未使用重要的返回对象。
基本用法
将 [[nodiscard]] 放在函数声明前,表示该函数的返回值应当被使用。
[[nodiscard]] int compute_value() {
return 42;
}
int main() {
compute_value(); // 警告:忽略 [[nodiscard]] 函数的返回值
return 0;
}
上面代码中,调用 compute_value() 但没有使用其返回值,编译器会发出警告。
应用于自定义类型
常用于返回状态、结果或资源的类或结构体,提醒用户不要忽略构造的结果。
立即学习“C++免费学习笔记(深入)”;
主要包括 Perl+DBI编程(chm).chmPerl+DBI编程-[美]笛卡尔-中国电力出版社-2001.pdfPerl DBI 关于使用Perl中的DBI的教程,供初学者参考Perl.DBI手册中文翻译版.pdfPerl DBI中文帮助文档,内容涉及Perl DBI名称、概述、描述、DBI类、处理器通用方法、通用属性、DBI数据库处理对象、数据库处理方法等。Programming_the_Perl_DBI.pdf
[[nodiscard]] struct OperationResult {
bool success;
std::string message;
};
[[nodiscard]] OperationResult do_something() {
return {true, "OK"};
}
int main() {
do_something(); // 警告:忽略 [[nodiscard]] 类型的返回值
return 0;
}
带消息的 [[nodiscard]](C++20)
C++20 扩展了 [[nodiscard]],允许添加说明文字,帮助开发者理解为何不能忽略返回值。
[[nodiscard("此函数返回错误码,必须检查")]]
int check_error() {
return -1;
}
int main() {
check_error(); // 警告信息中会包含括号内的提示
return 0;
}
何时使用 [[nodiscard]]
- 函数返回错误码(如 int、bool)时,防止调用者忽略错误
- 工厂函数创建重要对象,返回值需要被处理
- 移动语义相关函数(如 std::move 包装类)返回可移动对象
- 实现 RAII 资源管理类的获取函数
例如:
[[nodiscard]] std::unique_ptrcreate_resource(); [[nodiscard]] bool validate_input(const std::string&);
基本上就这些。合理使用 [[nodiscard]] 可提升代码安全性,让潜在疏忽在编译期暴露出来。不复杂但容易忽略。








