12

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

#include <iostream>

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

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

2 回答 2

10

正如您所观察到的,这是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)因此从符合要求的实现中调用用户定义行为的可能性为零。

于 2012-08-03T11:47:31.497 回答
8

添加一个

operator void() {}

照顾它。

于 2012-08-03T10:58:23.483 回答