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

VS2010でテンプレートクラスの初期化子リストでメンバにラムダ式をわたす時の問題

結論から言うとコンパイルできなかった。問題のソースは以下。

class Hoge{
public:
	template<class T>
	Hoge(T func){func();}

};

template<typename T>
class Foo{
public:
	Foo():
	  hoge([](){return true;})
	  {}


private:
	Hoge hoge;

};

int main(){

	return 0;
}

なぜだろうと思ってテンプレートじゃないバージョン

class Hoge{
public:
	template<class T>
	Hoge(T func){func();}

};

class Foo{
public:
	Foo():
	  hoge([](){return true;})
	  {}


private:
	Hoge hoge;

};



int main(){

	return 0;
}

だとコンパイルが通る。ちなみにg++でコンパイルしてみたところ通った。
なんでだろう?ちなみに回避方法は初期化子リストが問題なので普通に代入にしてあげれば大体解決できるはず。デフォルトコンストラクタ呼び出し、一時オブジェクト生成が入ってあれかもしれないが、後者はムーブコンストラクタで多少解決するかもしれない。もっといい方法はないものか...
VS2012にしたら解決するのかなぁ...