【发布时间】:2011-01-21 02:06:51
【问题描述】:
我正在尝试使用 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 怪癖?
【问题讨论】:
-
由于我无法访问该编译器:将尾随返回类型部分更改为
-> decltype(void(), f())有帮助吗? -
@Johannes:不,还是一样的结果
-
如果您删除
bar并尝试使用空 lambda 实例化foo会发生什么?foo( [](){} ) -
@David:然后它工作正常。这几乎是我能想出的最小的样本,它仍然重现了这个问题。
-
如果它与:stackoverflow.com/questions/2122282/… 相关,我不会感到惊讶。似乎 lambda 和 scope 在 VS2010 中不能很好地配合使用。顺便说一句,我的错误仍然存在于 RC 中。
标签: c++ lambda c++11 visual-c++-2010 decltype