如何避免“(void)a”演员造成副作用?

时间:2012-08-03 10:54:03

标签: c++ gcc void

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

#include <iostream>

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

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

2 个答案:

答案 0 :(得分:10)

正如您所观察到的,这是一个bug in gcc。标准如下:

  

     

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

     

(1)A   转换函数从不用于将(可能是cv-quali fi ed)对象转换为[...](可能是cv-quali fi ed)void。   116)转换为void不会调用任何转换函数(5.2.9)。

     

5.2.9静态演员[expr.static.cast]

     

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

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

a, void();

重载operator,(void)是不可能的,因此从符合要求的实现中调用用户定义的行为的可能性为零。

答案 1 :(得分:8)

添加

operator void() {}

照顾它。