Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中没有效果的语句有什么用+;?_C++_Templates - Fatal编程技术网

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;