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

Joh*_*itb 12 c++ gcc void

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

#include <iostream>

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

int main() {
  A a;
  (void)a;
}
Run Code Online (Sandbox Code Playgroud)

eca*_*mur 10

正如您所观察到的,这是gcc中的一个错误.标准如下:

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

(1)转换函数永远不会用于将(可能是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();
Run Code Online (Sandbox Code Playgroud)

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

  • "重载`运算符是不可能的,(void)`[...]"如果编译器错误怎么办?:P (5认同)

Jon*_*Jon 8

添加一个

operator void() {}
Run Code Online (Sandbox Code Playgroud)

照顾它.