C++0x ローカル型と無名型をテンプレート引数として使用

C++03 では、ローカル型と無名型はテンプレート引数として使用することはできませんでした。
(使用できるコンパイラはあるけど)

template <class T>
void foo(T t) {}

enum { e };

struct {
} noname;

int main()
{
    struct local {
    } a;

    foo(a);      // エラー!
    foo(e);      // エラー!
    foo(noname); // エラー!
}

C++0x ではこの制限がなくなります。



追記:
これがあると、以下のように、vectorの要素型にローカル型を指定できたりします。

int main()
{
    struct local {
        string name;
        int age;
    };

    vector<local> v;
}

N2657 Local and Unnamed Types as Template Arguments

C++0x言語拡張まとめ