Посмотрите на этот шаблон:
template <class T>
auto checkErrorCode(T& functor) -> decltype(functor()) {
auto retCode = functor();
// ... additional aspect-like stuff with retCode here
return retCode;
}
Предполагается выполнить лямбду, переданную внутри него, получить возвращаемое значение из лямбды, что-то с ним сделать, а затем вернуть его вызывающей стороне.Подумайте о «аспектном программировании», ведении журнала, о чем угодно.
Даже если он компилируется и отлично работает с этим ...
int foo(int param)
{
return param>10?0:-1;
}
main()
{
int param = 11;
// This compiles fine
auto action = [&](){ return foo(param); };
checkErrorCode( action );
}
... он не компилируется - и генерируетчтобы понять ошибку - когда я напрямую вызываю "checkErrorCode" со встроенной лямбдой:
int foo(int param)
{
return param>10?0:-1;
}
main()
{
int param = 11;
// This doesn't compile...
checkErrorCode( [&](){ return foo(param); } );
}
Есть мысли о том, почему?
g ++ выдает эту странную ошибку:
forSO.cpp: In function 'int main()':
forSO.cpp:24:5: error: no matching function for call to 'checkErrorCode(main()::<lambda()>)'
forSO.cpp:24:5: note: candidate is:
forSO.cpp:2:6: note: decltype (functor()) checkErrorCode(T&) [with T = main()::<lambda()>, decltype (functor()) = int]
forSO.cpp:2:6: note: no known conversion for argument 1 from 'main()::<lambda()>' to 'main()::<lambda()>&'
В маловероятном случае, если это ошибка компилятора:
bash$ g++ -v
...
gcc version 4.6.2 (GCC)