我正在尝试使用 C++0x,特别是 lambda 表达式和 decltype 来简化我的一些代码,使用 MSVC10 RC 编译器。
我遇到了以下非常奇怪的问题:
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([]() { })
。
我讨厌大喊“编译器错误”,但我真的看不出这个错误有什么好的解释。显然,在外部 lambda 表达式内部时,编译器无法 foo
为内部 lambda 专门化函数模板。
但是,如果将 的定义foo
更改为硬编码返回类型,如下所示:
template <typename F>
void foo(F f){
return f();
}
然后一切都编译得很好。
当用于在我不知道的另一个 lambda 范围内推断 lambda 表达式参数的返回类型时,是否存在一些模糊的 decltype 怪癖?