在C++中没有效果的语句有什么用?

Mar*_*dik 5 c++ templates

在我使用的一个库中,我看到了这段代码:

template<typename T>
void f(SomeTemplatedClass<T> input)
{
    (void)input;
    ...
    use(input); // code that uses input
}
Run Code Online (Sandbox Code Playgroud)

我不知道这段代码的含义是什么.如果我将演员阵容移除为无效,我会得到一个

statement has no effect 
Run Code Online (Sandbox Code Playgroud)

gcc中的警告.所以我想有人故意这样做,故意添加演员以摆脱警告.

您是否对任何无效的陈述有任何经验,但由于某种原因需要它?

编辑:

假设这与模板无关,这是安全的吗?例如绕过旧的编译器错误等?

dav*_*pfx 4

此构造是欺骗编译器不向未使用的参数发出警告的常用方法.我没有看到它用于任何其他目的.

(void)input;
Run Code Online (Sandbox Code Playgroud)

虽然很常见,但这也是一个非常糟糕的主意.

  • 它是高度依赖平台的 - 它可能适用于一个编译器而不是另一个编译器.
  • 这是不必要的.总有一种更好的方法来处理未使用的参数.现代的方法是简单地省略参数名称.
  • 如果代码发生变化并且现在使用了参数(这里似乎就是这种情况),它可能会被遗忘.
  • 它会适得其反.有些编译器可能会将此视为无效.

根据C++标准N3936 S5.4/11:

在某些情况下,表达式仅出现其副作用.这种表达式称为丢弃值表达式.计算表达式并丢弃其值.

编译器有权观察到没有副作用,因此该构造至少应该发出警告.根据@chris的说法,MSVC就是其中一个编译器.