c++ - 将函数转换为 void 是否是“旧式转换”?
问题描述
Coverity 抱怨我们代码库中的各种函数调用都没有检查返回值。
未检查的返回值 (CHECKED_RETURN)3。check_return:在不检查返回值的情况下调用 Append(就像其他地方 78 次中的 73 次所做的那样)。
void
过去,我们可以通过将返回值转换为(如这里讨论的)来简单地解决这个问题(在仔细检查返回值是否真的不重要之后):
(void)Foo.Append(bar);
但是,我们正朝着启用所有警告的方向发展,并将警告视为错误,所以我有点担心上面的代码会生成old-style-cast
诊断。如果是这种情况,我需要将我们的代码修改为更丑陋的格式:
static_cast<void>( Foo.Append(bar) );
但是,gcc和clang似乎都能够毫无怨言地编译这段代码(第一种形式)。所以我想我的问题的最终形式是这样的:void
就 C 风格的转换而言,将函数返回到视为规则的例外吗?还是我需要仔细检查我的代码,看看有问题的行是否实际上没有包含在这些构建中?
解决方案
没关系。
(void) f(x);
总是等价于 a static_cast
as per [expr.static.cast]/6
:
任何表达式都可以显式转换为 cv void 类型,在这种情况下,它变成了废弃值表达式。
将函数的结果转换为void
是使表达式成为丢弃值表达式的方法。现在,C++ 方式应该是static_cast<void>(...)
but(void) ...
是一个习惯用法(并且更短)。
由于后者定义明确并且在代码库中非常常见,因此 gcc 1和 clang 2使它不触发Wold-style-cast
。
它定义明确,被主要编译器认可。没关系。
1) g++ 文档 --- 3.5 控制 C++ 方言的选项
-Wold-style-cast
(仅限 C++ 和 Objective-C++)如果在 C++ 程序中使用
旧样式(C 样式)强制转换为非 void类型,则发出警告。新风格的演员表 (dynamic_cast
,static_cast
,reinterpret_cast
, 和const_cast
) 不太容易受到意外影响,并且更容易搜索。
2) 没有记录
推荐阅读
- machine-learning - 我应该在哪里通过编码器-解码器架构中的预训练词嵌入?
- sql-server - 使用“in”子句加速 SQL 查询
- css - show div *ngIf 路由器活动导航栏
- javascript - JavaScript switch 语句只返回第一种情况
- unique - 如何防止在 MemSQL 中重复插入行?
- javascript - 如何在 Javascript 中使用 iOS playinline
- python - 在带有 boto 的 lambda 中使用 get_cost_and_usage 时出错
- python - 连接到 Google Compute Engine 实例以运行 Python 脚本
- jquery - 为什么 $(this).prop("id") 在这种情况下未定义?
- python - 如何将此列表附加保存功能修复到文件?