我有这段代码,GCC 打印“什么!?”。我怎样才能避免这种情况,以便 void 演员只是具有 C 意思“忽略孤独的'a;'”?
#include <iostream>
struct A {
template<typename T>
operator T() {
std::cout << "what!?";
}
};
int main() {
A a;
(void)a;
}
正如您所观察到的,这是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() {}
照顾它。