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

时间:2014-07-23 14:02:29

标签: c++ templates

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

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

我不知道这段代码的含义是什么。如果我将演员表删除为空,我会得到一个

statement has no effect 
gcc中的

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

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

修改

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

1 个答案:

答案 0 :(得分:4)

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

(void)input;

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

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

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

  

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

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