いろきゅうの(元)はてなダイアリー

はてなダイアリーから移行中…

謎のクラス

某匿名掲示板で見つけたコード。(可変してますが意味は同じ)
struct A
{
   template<typename T> T* ()
   {
      return 0;
   }
};

int func()
{
   A a;
   a[0];  // OK
   return 0;
}

こんなコード。
a[0] で A::operator T* が勝手に呼ばれるわけですね。 呼ばれるのは妥当だと思うんです。 が、この場合の T って何を指すのよと

つーわけで、typeid(T).name() してみたところ、「class `template-parameter-257'」 ちゅー型名が出てきました。 いかにもテンポラリな型名ですなぁ。(笑

更に実験してみると…

class B{};

T t0 = B();        // OK
T t1 = POINT(); // OK
T t2 = 169;       // OK

何でも入りやがりました。(笑
なんじゃこりゃー。 ただし、初期化しかできないようで、

t1 = 10;  // C1001 // 内部コンパイラエラー(笑

という具合に、代入は出来ませんでした。
しかしながら、

int n = t0;  // warning C4700 // t0 は値が割り当てられてない

は、とりえあえずOKだったりして。
ただし、実行時に「t0は定義されて無ぇよ」と怒られます。


バグではないんでしょうが、動作が怪しいなぁー。(笑