我看到了我正在使用的SDK中的一些功能,其操作类似于以下内容:
void foo( float& fl )
{
if ( std::isnan( fl ) || std::isinf( fl ) )
return ( void )( fl = 0.f );
/*...*/
}
为什么?
答案 0 :(得分:3)
为什么?
表面上,有人只是在“聪明”。您会看到,对C ++中的return语句有一些限制
[stmt.return]
2 return语句的 expr-or-braced-init-list 被称为 操作数。没有操作数的return语句只能用于 返回类型为 cv
void
的函数,构造函数或 析构函数。操作数类型为void
的return语句应为 仅在返回类型为 cvvoid
的函数中使用。回报 带有任何其他操作数的语句应仅在函数中使用 其返回类型不是 cvvoid
; [...]
以上内容使该函数中的简单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;
}
/*...*/
}
没有特别的理由偏爱一种方式。