#include<iostream>
#include<thread>
using namespace std;
void f1(double& ret) {
ret=5.;
}
int main() {
double ret=0.;
thread t1(f1, ret);
t1.join();
cout << "ret=" << ret << endl;
}
Приведенный выше код не компиляции со следующим error message:C++ Автор принимает аргумент ссылки не удалось собрать
g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
In file included from /usr/local/include/c++/5.3.0/thread:39:0,
from main.cpp:2:
/usr/local/include/c++/5.3.0/functional: In instantiation of 'struct std::_Bind_simple<void (*(double))(double&)>':
/usr/local/include/c++/5.3.0/thread:137:59: required from 'std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(double&); _Args = {double&}]'
main.cpp:11:21: required from here
/usr/local/include/c++/5.3.0/functional:1505:61: error: no type named 'type' in 'class std::result_of<void (*(double))(double&)>'
typedef typename result_of<_Callable(_Args...)>::type result_type;
^
/usr/local/include/c++/5.3.0/functional:1526:9: error: no type named 'type' in 'class std::result_of<void (*(double))(double&)>'
_M_invoke(_Index_tuple<_Indices...>)
^
Я понимаю, что я могу использовать std::ref()
передать аргумент. Но если я передаю по значению, почему это ошибка, так как thread
должен просто скопировать аргумент значение и передать некоторый объект, хранящийся внутри потока, для связывания с эталонным аргументом функции f1
.
Я чувствую, что если я могу понять, что делает этот result_of
и почему он дает ошибку, я могу лучше понять причину. Так может ли кто-нибудь пройти меня через сообщение об ошибке? В частности, значения std::_Bind_simple<void (*(double))(double&)>
и std::result_of<void (*(double))(double&)>
.
EDIT: Я знаю, что если передаю значение, поток будет работать только с копией и не будет иметь эффекта после возврата потока. Это не мое беспокойство. Я хочу знать, почему он дает ошибку сейчас, но это не дает ошибку на другие должности на SO, как следующее: Difference between pointer and reference as thread parameter
@Barry, вы потеряли «выделенную часть» с редактирования. –
@JonathanWakely Исправлено. – Barry