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