某匿名掲示板で見つけたコード。(可変してますが意味は同じ)
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は定義されて無ぇよ」と怒られます。
バグではないんでしょうが、動作が怪しいなぁー。(笑