MSVC10 RC コンパイラを使用して、C++0x、特にラムダ式と decltype を使用してコードの一部を簡素化しようとしています。
次の非常に奇妙な問題に遭遇しました。
template <typename F>
auto foo(F f) -> decltype(f()){
return f();
}
template <typename F>
void bar(F f){
f();
}
int main() {
bar([](){
foo([]() { }); // error C2893: Failed to specialize function template ''unknown-type' foo(F)'
});
}
コメントに示されているように、コンパイラは次の行でエラーを生成しますfoo([]() { })
。
「コンパイラのバグ」と大声で叫ぶのは嫌いですが、このエラーの適切な説明がまったく見つかりません。どうやら、外側のラムダ式の内部では、コンパイラは foo
内側のラムダの関数テンプレートを特殊化できません。
ただし、次のように、 の定義がfoo
戻り値の型をハードコードするように変更された場合:
template <typename F>
void foo(F f){
return f();
}
その後、すべてが正常にコンパイルされます。
私が気付いていない別のラムダのスコープ内でラムダ式パラメータの戻り値の型を推測するために使用される場合、decltype のあいまいな癖はありますか?