【问题标题】:How to avoid "(void)a" cast causing side-effects?如何避免“(void)a”演员造成副作用?
【发布时间】:2012-08-03 10:54:02
【问题描述】:

我有这段代码,GCC 会打印“什么!?”。我怎样才能避免这种情况,所以 void 演员只是有 C 意思“忽略孤独的 'a;'”?

#include <iostream>

struct A {
  template<typename T>
  operator T() { 
    std::cout << "what!?";
  }
};

int main() {
  A a;
  (void)a;
}

【问题讨论】:

  • 你为什么需要这个?
  • 不可以用void专门化模板函数吗? (空体)
  • 请注意,在 C 中,如果 a 对象是 volatile 限定的,那么语句 (void) a; 也会产生副作用

标签: c++ gcc void


【解决方案1】:

如您所见,这是bug in gcc。标准如下:

12.3.2 转换函数[class.conv.fct]

(1) 一个 转换函数永远不会用于将(可能是 cv 限定的)对象转换为 [...](可能是 cv 限定的)void。
116) 转换为 void 不会调用任何转换函数 (5.2.9)。

5.2.9 静态转换 [expr.static.cast]

(6) 任何表达式都可以显式转换为 cv void 类型,在这种情况下,它变成了废弃值 表达式(第 5 条)。

作为一种解决方法,您可以编写:

a, void();

不可能重载operator,(void),因此从一致的实现中调用用户定义行为的可能性为零。

【讨论】:

  • "不可能重载operator,(void) [...]" 如果编译器有问题怎么办? :P
  • ...或者说有点不同,需要变通方法来实现符合要求的可能性为零。
  • 谢谢!我无法想象我以前没有打过这个。
【解决方案2】:

添加一个

operator void() {}

照顾它。

【讨论】:

    猜你喜欢
    • 2014-11-29
    • 1970-01-01
    • 2021-07-30
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多