Я читаю С++ concurrency в действии. В главе 2.4 описывается алгоритм parallell_accumulate.
Я попробовал - как учебный эксперимент - заменить используемый здесь функтор с общей лямбдой.
Я перегонял ошибку компиляции до:
#include <thread>
template <typename T>
struct f {
void operator() (T& result) { result = 1;}
};
int main() {
int x = 0;
auto g = [](auto& result) { result = 1; };
std::thread(f<int>(), std::ref(x)); // COMPILES
std::thread(g, std::ref(x)); // FAILS TO COMPILE
}
Сообщение об ошибке:
In file included from /usr/include/c++/4.9/thread:39:0,
from foo.cpp:1:
/usr/include/c++/4.9/functional: In instantiation of ‘struct std::_Bind_simple<main()::<lambda(auto:1&)>(std::reference_wrapper<int>)>’:
/usr/include/c++/4.9/thread:140:47: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = main()::<lambda(auto:1&)>&; _Args = {std::reference_wrapper<int>}]’
foo.cpp:13:31: required from here
/usr/include/c++/4.9/functional:1665:61: error: no type named ‘type’ in ‘class std::result_of<main()::<lambda(auto:1&)>(std::reference_wrapper<int>)>’
typedef typename result_of<_Callable(_Args...)>::type result_type;
^
/usr/include/c++/4.9/functional:1695:9: error: no type named ‘type’ in ‘class std::result_of<main()::<lambda(auto:1&)>(std::reference_wrapper<int>)>’
_M_invoke(_Index_tuple<_Indices...>)
^
Моя версия компилятора
$ g++ --version
g++ (Ubuntu 4.9.1-16ubuntu6) 4.9.1
Почему компиляция не выполняется для лямбда, но не для функтора?
РЕДАКТИРОВАТЬ: Как я могу достичь того, что делает функтор (присваивание ref) с помощью общей лямбда?