Coverity提示我们的代码库中的各种函数调用都没有检查返回值。



过去,通过将返回值转换为void(如here所述),我们可以简单地解决此问题(在仔细检查返回值确实不重要之后):

(void)Foo.Append(bar);

但是,我们正在努力启用所有警告,并将警告视为错误,因此我有点担心上面的代码将生成old-style-cast诊断。如果是这种情况,我将需要将我们的代码修改为难看的格式:
static_cast<void>( Foo.Append(bar) );

但是, gcc clang 似乎都可以编译此代码(第一种形式)而无需提示。因此,我想我的问题的最终形式是:就C样式转换而言,将函数转换为void视为该规则的异常(exception)吗?还是我需要仔细检查我的代码,看看所涉及的行是否实际上未包含在这些版本中?

最佳答案

没关系。

(void) f(x);

根据 static_cast 始终等于[expr.static.cast]/6:



将函数的结果转换为void是使表达式成为discard-value-expression的方法。现在,C++方式应该是static_cast<void>(...),但是(void) ...是一个习惯用法(并且更短)。

由于后者定义明确,并且在代码库中确实很常见,因此gcc1和clang2使其不会触发Wold-style-cast

它定义明确,已被主要编译器认可。没关系。

1)g++ documentation --- 3.5 Options Controlling C++ Dialect



2)not documented

09-09 23:53
查看更多