强制转换功能是否会使“旧样式转换”无效?

时间:2018-11-26 16:32:49

标签: c++ casting suppress-warnings

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

  

未经检查的返回值(CHECKED_RETURN)3。 check_return:通话追加   无需检查返回值(就像在其他地方所做的一样,在78中占73   次)。

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

(void)Foo.Append(bar);

但是,我们正朝着启用所有警告的方向前进,将警告视为错误,因此我有点担心上面的代码将生成old-style-cast诊断。如果是这样,我将需要将我们的代码修改为难看的格式:

static_cast<void>( Foo.Append(bar) );

但是, gcc clang 似乎都能够编译此代码( first 表单)而不会抱怨。因此,我想我的问题的最终形式是:就C样式转换而言,将函数强制转换为void是否被视为规则的例外?还是我需要仔细检查我的代码,看看所涉及的行是否实际上未包含在这些版本中?

1 个答案:

答案 0 :(得分:7)

很好。

(void) f(x);

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

  

任何表达式都可以显式转换为cv void类型,在这种情况下,它将成为一个废弃值表达式。

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

由于后者定义明确且在代码库中确实很常见,因此gcc 1 和clang 2 使其成为 not 触发器{{1} }。

定义明确,被主要编译器认可。很好。


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

  

Wold-style-cast(仅限C ++和Objective-C ++)
  如果在C ++程序中使用了旧样式(C样式)强制转换为非空类型,则发出警告。新型强制类型转换(-Wold-style-castdynamic_caststatic_castreinterpret_cast不太容易受到意想不到的影响,并且更易于搜索。

2) not documented