虚函数执行return(void)(某物)

时间:2018-11-07 03:23:13

标签: c++

我看到了我正在使用的SDK中的一些功能,其操作类似于以下内容:

void foo( float& fl )
{
    if ( std::isnan( fl ) || std::isinf( fl ) )
        return ( void )( fl = 0.f );
    /*...*/
}

为什么?

3 个答案:

答案 0 :(得分:3)

  

为什么?

表面上,有人只是在“聪明”。您会看到,对C ++中的return语句有一些限制

  

[stmt.return]

     

2 return语句的 expr-or-braced-init-list 被称为   操作数。没有操作数的return语句只能用于   返回类型为 cv void的函数,构造函数或   析构函数。操作数类型为void的return语句应为   仅在返回类型为 cv void的函数中使用。回报   带有任何其他操作数的语句应仅在函数中使用   其返回类型不是 cv void; [...]

以上内容使该函数中的简单return ( fl = 0.f );无效。因为表达式( fl = 0.f )(返回语句的操作数)的类型不是void。但是该函数的作者可能是为了节省代码行或表达某种“优雅”,决定强迫该问题。由于类型为void的操作数还可以,因此他们添加了强制类型转换。这不是使编译器提交的唯一方法,例如:

return fl = 0.f , void();

这使用了逗号运算符和void() prvalue。这不是我个人提倡编写的代码。您的帖子中的代码以及这种替代方法都是成语的,令人困惑的和误导的。花括号({})会使该功能更加清晰。因此,尽管我希望您从中学习到有关C ++的知识,但不要养成编写此类代码的习惯。如果您写的代码一眼就能理解,您的同事就会对您有更高的评价。

答案 1 :(得分:1)

    return ( void )( fl = 0.f );
  

为什么?

那是非常不寻常的代码。将表达式强制转换为void通常是为了禁止编译器警告-这是一个习惯用法,告诉编译器“是的,我知道我正在抛弃该表达式的值-但我是故意这样做的,所以您无需警告我。”

不同寻常的是,作者在return声明中决定这样做。写起来会更清楚(在逻辑上等效)

{
   fl = 0.0f;
   return;
}

相反。我唯一能想到的是用于返回值的函数,也许作者认为他可能有一天想更改它以再次返回值,因此将尝试使代码样式看起来与价值返回功能? (如果是这样,对我来说似乎有点“太聪明”)

答案 2 :(得分:-1)

相同
void foo( float& fl )
{
    if ( std::isnan( fl ) || std::isinf( fl ) )
    {
        fl = 0.f;
        return;
    }
    /*...*/
}

没有特别的理由偏爱一种方式。