为什么把未使用的返回值作废?

int fn(); void whatever() { (void) fn(); } 

是否有任何理由将未使用的回报价值废除,还是我认为这是完全浪费时间?

跟进:

那么这似乎相当全面。 我认为它比评论一个未使用的返回值更好,因为自我logging代码比评论更好。 就个人而言,我会把这些警告closures,因为这是不必要的噪音。

如果一个bug因为它而逃脱,我会吃掉我的话…

大卫的回答几乎涵盖了这个动机,明确地向其他“开发者”表明你知道这个函数返回,但你明确地忽略它。

这是一种确保始终处理必要的错误代码的方法。

我认为对于C ++来说,这可能是我更喜欢使用C风格转换的唯一地方,因为使用完整的静态转换符号只是在这里感觉过度。 最后,如果您正在审阅编码标准或编写标准,那么明确指出重载操作符(不使用函数调用符号)的调用也应该免除:

 class A {}; A operator+(A const &, A const &); int main () { A a; a + a; // Not a problem (void)operator+(a,a); // Using function call notation - so add the cast. 

在工作中,我们使用它来确认函数具有返回值,但开发人员声称忽略它是安全的。 既然你把问题标记为C ++,你应该使用static_cast

 static_cast<void>(fn()); 

至于编译器将返回值转换为void没有什么意义。

这样做的真正原因可以追溯到C代码中使用的工具lint 。

它分析代码寻找可能的问题,并发出警告和build议。 如果一个函数返回了一个没有被检查的值,那么在这个意外的情况下, lint会发出警告。 为了使这个警告无声无息,你把电话打到(void)

强制转换为void用于禁止未使用的variables和未保存的返回值或expression式的编译器警告。

标准(2003)在§5.2.9/ 4中说,

任何expression式都可以显式转换为types“cv void”,expression式值将被丢弃

所以你可以写:

 //suppressing unused variable warnings static_cast<void>(unusedVar); static_cast<const void>(unusedVar); static_cast<volatile void>(unusedVar); //suppressing return value warnings static_cast<void>(fn()); static_cast<const void>(fn()); static_cast<volatile void>(fn()); //suppressing unsaved expressions static_cast<void>(a + b * 10); static_cast<const void>( x &&y || z); static_cast<volatile void>( m | n + fn()); 

所有表格都是有效的。 我通常把它缩短为:

 //suppressing expressions (void)(unusedVar); (void)(fn()); (void)(x &&y || z); 

它也没关系。

对于你的程序铸造无效的function是没有意义的。 我也会争辩说,正如大卫的回答所build议的,你不应该用它来向正在阅读代码的人发出信号。 如果你想传达你的意图,最好使用评论。 添加这样的演员只会看起来很奇怪,并提出可能的原因问题。 只是我的观点…

投入是无效的。 这只是编译器如何处理它的信息。

在C中,抛弃是完全没问题的。 几乎任何人都会明白这个声明的意图。

在C ++中,您可以使用其他工具。 由于C铸造通常皱眉,而且由于明确的演员将无效可能会惊讶你的同事(这令我惊讶),我有这个函数模板的地方

 template <typename T> void use_expression(const T&) {} 

我用

 ... use_expression(foo()); 

我将在C中写(void)foo()

另外,在validation代码符合MISTA(或其他)标准时,如LDRA等自动工具将不允许您调用具有返回types的函数,而不会返回值,除非将显式地将返回值转换为(void)