我有这段代码,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() {}
处理它。