Я пытаюсь использовать С++ 0x и, в частности, лямбда-выражение и 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([]() { })
.
Я ненавижу кричать "ошибка компилятора", но я действительно не вижу никакого хорошего объяснения этой ошибке. Судя по всему, находясь внутри внешнего лямбда-выражения, компилятор не может специализировать шаблон функции foo
для внутреннего лямбда-выражения.
Однако, если определение foo
изменено, чтобы жестко указать тип возвращаемого значения, например:
template <typename F>
void foo(F f){
return f();
}
тогда все компилируется нормально.
Есть ли какая-то непонятная особенность decltype при использовании для вывода возвращаемого типа параметров лямбда-выражения внутри области действия другой лямбда-выражения, о которой я не знаю?
-> decltype(void(), f())
? - person Johannes Schaub - litb   schedule 25.02.2010bar
и просто попытаетесь создать экземплярfoo
с пустой лямбдой?foo( [](){} )
- person David Rodríguez - dribeas   schedule 25.02.2010bar
:int main() { auto x = []() { foo([](){}); }; }
Выдает ту же ошибку. - person GManNickG   schedule 25.02.2010