読者です 読者をやめる 読者になる 読者になる

コンパイラを殺す方法

VC++

とてもくだらないこと

コンパイラを殺す方法です(VC++8.0で検証)


方法1.自分への参照

用意するもの

struct hoge {
    hoge& me() { return *this; } // 自分への参照を返す

    void hello() const { std::cout << "Hello" << std::endl; }
};


それで、こう使います

int main()
{
    hoge().me().me().me().me().me().me().me().me().me().me().hello();
    return 0;
}

さて、コンパイラはこのme()の連鎖にどれくらい耐えられるでしょうか



7995回でコンパイラが内部エラーになりました


fatal error C1001: コンパイラで内部エラーが発生しました。
この問題を回避するには、上記の場所付近のプログラムを単純化するか変更してください。



とてもくだらない。。。。





方法2.再帰テンプレート

用意するもの

// 指定された値〜0までの合計を計算
template <int n>
struct sum {
    enum { value = n + sum<n - 1>::value };
};

template <>
struct sum<0> {
    enum { value = 0 };
};


使い方

int main()
{
    cout << sum<10>::value << endl; // 55
    return 0;
}


さて、何回の再帰に耐えられるでしょうか



sum<490>::value
これでコンパイラが内部エラーになりました




再帰テンプレートはあまり大きな計算には向かないようですね
(実際は値の計算に使うことは多くないでしょうが)