【问题标题】:C++ What is the purpose of casting to void? [duplicate]C++ 强制转换为 void 的目的是什么? [复制]
【发布时间】:2011-05-09 21:15:52
【问题描述】:

可能重复:
casting unused return values to void

我阅读了一些源代码,其中接口类中的许多虚函数被声明并默认实现为:

virtual bool FunctionName(TypeName* pointer)
{
   (void)pointer;
   return true;
}

请问在默认实现中将指针强制转换为 void 的目的是什么?

【问题讨论】:

  • 这不应该编译,因为函数需要返回一个值。
  • 这个问题被问了无数次。将某些内容转换为 void 表示您没有使用返回值。在你的情况下,这是一个空操作。
  • @zneak: pointer 不是返回值。不是这个问题的傻瓜,虽然我确信这已经涵盖了参数。
  • 我在这里不明白为什么代码不只是FunctionName(TypeName*) { }(可能带有返回值)。哪个编译器会为此吐出“未使用”警告?
  • @Steve 是一个具有内联定义的虚函数,所以如果它是一个没有做任何定义的基类,那么您仍然需要参数的名称以用于文档目的。

标签: c++ virtual


【解决方案1】:

多种用途,取决于你投射的内容

  • 向编译器标记您的意图,即完全为空操作的表达式应按原样编写(例如,用于禁止警告)
  • 向编译器和程序员表明您的意图是忽略某些结果(例如函数调用的结果)
  • 在函数模板中,如果返回类型由模板参数类型T 给出,并且您返回的某些函数调用的结果在某些情况下可能与T 不同。在void 的情况下,显式转换为T 可以防止编译时错误:
    int f() { return 0; } void g() { return (void)f(); }
  • 禁止编译器选择逗号运算符重载((void)a, b 永远不会调用重载的逗号运算符函数)。

请注意,如果您将类对象强制转换为 void,则标准保证永远不会调用 operator void()(但某些 GCC 版本会忽略该规则)。

【讨论】:

    【解决方案2】:

    在这种情况下,它只是为了避免编译器对未使用参数的警告。

    【讨论】:

    • +1:给出正确答案
    • 为什么要先做这样的参数?
    • 该参数可能会出现,因为也实现此虚函数的其他一些类实际上确实使用了该参数。
    • 示例:在您的一个子类中,您希望虚函数的参数 x 始终为零。你写了一个断言 (x == 0) 但不要使用 x 否则。 (void) x 很有可能在没有警告的情况下编译一个调试版本和一个发布版本。
    猜你喜欢
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多