在我使用的一个库中,我看到了这段代码:
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中的警告.所以我想有人故意这样做,故意添加演员以摆脱警告.
您是否对任何无效的陈述有任何经验,但由于某种原因需要它?
编辑:
假设这与模板无关,这是安全的吗?例如绕过旧的编译器错误等?
此构造是欺骗编译器不向未使用的参数发出警告的常用方法.我没有看到它用于任何其他目的.
(void)input;
Run Code Online (Sandbox Code Playgroud)
虽然很常见,但这也是一个非常糟糕的主意.
根据C++标准N3936 S5.4/11:
在某些情况下,表达式仅出现其副作用.这种表达式称为丢弃值表达式.计算表达式并丢弃其值.
编译器有权观察到没有副作用,因此该构造至少应该发出警告.根据@chris的说法,MSVC就是其中一个编译器.