如何避免"(void)a"石膏造成副作用?



我有这段代码,GCC打印"什么!?"。我该如何避免这种情况,这样空洞的铸造就有了C的意思"忽略孤独的‘a;’"?

#include <iostream>
struct A {
  template<typename T>
  operator T() { 
    std::cout << "what!?";
  }
};
int main() {
  A a;
  (void)a;
}

正如您所观察到的,这是gcc中的一个bug。标准上写着:

c++11

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

(1) A转换函数从不用于将(可能是cv限定的)对象转换为[…](可能是cv限定的)void
116)转换为无效不会调用任何转换功能(5.2.9)

5.2.9静态铸造[expr.Static.cast]

(6) 任何表达式都可以显式转换为cv-vvoid类型,在这种情况下,它将成为一个丢弃的值表达(第5条)。

作为一种变通方法,你可以写:

a, void();

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

添加

operator void() {}

处理它。

最新更新