int fn();
void whatever()
{
(void) fn();
}
Run Code Online (Sandbox Code Playgroud)
是否有任何理由将未使用的返回值转换为无效,或者我是否认为这完全是浪费时间?
跟进:
那看起来相当全面.我认为这比评论未使用的返回值更好,因为自我记录代码比评论更好.就个人而言,我会关掉这些警告,因为这是不必要的噪音.
如果一个虫子逃脱,我会吃掉我的话......
Ric*_*den 73
大卫的答案几乎涵盖了这一点的动机,明确地向其他"开发人员"表明你知道这个函数会返回,但是你明确地忽略了它.
这是一种确保始终处理必要的错误代码的方法.
我认为对于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.
Run Code Online (Sandbox Code Playgroud)
Dav*_*olm 44
在工作中,我们使用它来确认该函数具有返回值,但开发人员声称忽略它是安全的.由于您将问题标记为C++,因此您应该使用static_cast:
static_cast<void>(fn());
Run Code Online (Sandbox Code Playgroud)
就编译器而言,将返回值转换为void几乎没有意义.
Naw*_*waz 22
Casting to void
用于抑制未使用变量和未保存返回值或表达式的编译器警告.
标准(2003)在§5.2.9/ 4中说,
可以将任何表达式显式转换为"cv void"类型.表达式值将被丢弃.
所以你可以写:
//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());
Run Code Online (Sandbox Code Playgroud)
所有表格均有效.我通常把它缩短为:
//suppressing expressions
(void)(unusedVar);
(void)(fn());
(void)(x &&y || z);
Run Code Online (Sandbox Code Playgroud)
它也没关系.
Pac*_*ace 13
[[maybe_unused]] auto unused = fn();
Run Code Online (Sandbox Code Playgroud)
更新:不建议使用这种方法,因为它可能会在规范的未来版本中出现问题。 请参阅这篇文章以获取更多讨论。
从 C++11 开始,您还可以执行以下操作:
std::ignore = fn();
Run Code Online (Sandbox Code Playgroud)
这应该在标记为的函数上获得相同的结果[[nodiscard]]