是否将函数 return 转换为无效 "old-style-cast"?

Is casting a function return to void an "old-style-cast" or not?

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

Unchecked return value (CHECKED_RETURN)3. check_return: Calling Append without checking return value (as is done elsewhere 73 out of 78 times).

在过去,我们会通过将 return 转换为 void(因为讨论 here):

(void)Foo.Append(bar);

但是,我们正朝着启用所有警告的方向努力,并且将警告视为错误,所以我有点担心上面的代码会生成一个 old-style-cast诊断。如果是这样的话,我将需要将我们的代码修改为更丑陋的格式:

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

然而,gccclang 似乎都能够编译此代码(first 形式)没有抱怨。所以我想我的问题的最终形式是这样的:就 C 风格的转换而言,将函数 return 转换为 void 是否被视为规则的例外?或者我是否需要仔细检查我的代码,看看有问题的行是否实际上没有包含在这些构建中?

还好。

(void) f(x);
根据 [expr.static.cast]/6:

始终等同于 static_cast

Any expression can be explicitly converted to type cv void, in which case it becomes a discarded-value expression.

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

由于后者定义明确并且在代码库中非常常见,gcc1 和 clang2 使其成为 触发Wold-style-cast.

它定义明确,被主要编译器识别。没关系。


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

-Wold-style-cast (C++ and Objective-C++ only)
Warn if an old-style (C-style) cast to a non-void type is used within a C++ program. The new-style casts (dynamic_cast, static_cast, reinterpret_cast, and const_cast) are less vulnerable to unintended effects and much easier to search for.

2) not documented