12

私はこのコードを持っていて、GCCは「what!?」を出力します。どうすればそれを回避できますか?ボイドキャストが単に「孤独な'a;'を無視する」という意味のCを持つようにするには?

#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 に答える