私はこのコードを持っていて、GCCは「what!?」を出力します。どうすればそれを回避できますか?ボイドキャストが単に「孤独な'a;'を無視する」という意味のCを持つようにするには?
#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() {}
それの世話をします。