C++ 在C+中没有效果的语句有什么用+;?
在我使用的一个库中,我看到了以下代码:C++ 在C+中没有效果的语句有什么用+;?,c++,templates,C++,Templates,在我使用的一个库中,我看到了以下代码: template<typename T> void f(SomeTemplatedClass<T> input) { (void)input; ... use(input); // code that uses input } gcc中的警告。所以我想有人故意这么做,故意增加演员阵容来消除警告 你是否有过这样的经历:一个陈述没有效果,但出于某种原因需要它 编辑: 假设这与模板无关,安全吗?例如,规避旧的编译
template<typename T>
void f(SomeTemplatedClass<T> input)
{
(void)input;
...
use(input); // code that uses input
}
gcc中的警告。所以我想有人故意这么做,故意增加演员阵容来消除警告
你是否有过这样的经历:一个陈述没有效果,但出于某种原因需要它
编辑:
假设这与模板无关,安全吗?例如,规避旧的编译器错误或类似问题?此构造是一种常见的方法,可以诱使编译器不对未使用的参数发出警告。我没有看到它被用于任何其他用途
(void)input;
虽然这很普遍,但这也是一个非常糟糕的主意
- 它高度依赖于平台——它可以在一个编译器上工作,而不能在另一个编译器上工作
- 这是不必要的。总是有更好的方法来处理未使用的参数。现代的方法是省略参数名
- 如果代码更改并且现在使用了参数,它可能会落后(这里的情况就是这样)
- 这可能适得其反。某些编译器可能会将其视为无效
根据C++标准N39 36 S5.4/11:< /P> 在某些上下文中,表达式仅因其副作用而出现。这样的表达式称为丢弃值表达式。表达式将被求值,其值将被丢弃
编译器有权观察到没有副作用,因此这个构造至少应该得到警告。根据@chris的说法,MSVC就是其中之一。这是一种诱使编译器不对未使用的变量发出警告的方法。
while(doSomething()){}
顺便说一句,另一种防止警告的方法就是不命名参数。当您有一个assert
可能处于活动状态,也可能不处于活动状态时,现有的方法非常有用。哦,这个变量是否在其他地方使用?那么我想不出有什么理由想要保留这个语句。除了关于不命名参数的注释外,您还可以在声明中命名它,但不能在定义中命名它。名称(或缺少名称)不需要匹配。注意:某些参数(或变量)可能仅在调试中使用,而不在发布中使用,在这种情况下,不命名它们根本不是一个选项。在这种情况下,您的建议是什么?我看到了Herb Sutter的一个技巧:template void unused_variable(T&&){}
然后unused_variable(input)代码>尽管当人们使用它时,它可能会产生误导。发布代码应该尽可能干净,没有这些东西。调试代码应采用不强加此类要求的策略。把这个当作一个单独的问题来考虑。
(void)input;