Я пытаюсь использовать C ++ 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, когда он используется для определения типа возвращаемого значения параметров лямбда-выражения в области видимости другой лямбды, о которой я не знаю?