クラススコープの変数テンプレート

クラススコープでは,変数テンプレートは静的なメンバ変数でしか使えない.

struct X {
    // OK
    template<class T>
    static T hoge = T{};

    // NG
    template<class T>
    T huga = T{};
};

なので,オブジェクトごとにメンバ変数テンプレートを持つということはできない. 少なくとも現時点での clang のエラーメッセージではどこがまずいのか気づけなかった.

error: member 'huga' declared as template

non static data member initializerC++11 ですでにあるので,クラスの非静的データメンバとして変数テンプレートを持ててもおかしくないと思っていたけれど,N3651 の変数テンプレートの規格改訂提案にも

A variable template at class scope is a static data member template

とちゃんと書いてあった. @cpp_akira さんに言われて気づいたけれど,クラスのサイズが定まらなくなってしまうので,確かにまずい.

また忘れて同じことをしてハマりそうなのでメモ.