#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;
}
Il codice di cui sopra non riesce compilation con il seguente error message:C++ Discussione prendendo argomento di riferimento non è riuscito compilare
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...>)
^
ho capito che posso usare std::ref()
per passare l'argomento. Ma se passo il valore, perché è un errore dal momento che thread
deve semplicemente copiare l'argomento per il valore e passare alcuni oggetti memorizzati all'interno del thread per associare l'argomento di riferimento della funzione f1
.
Sento che se riesco a capire cosa sta facendo questo result_of
e perché sta dando un errore, posso capire meglio il motivo. Quindi qualcuno potrebbe guidarmi attraverso l'errore msg? Soprattutto il significato di std::_Bind_simple<void (*(double))(double&)>
e std::result_of<void (*(double))(double&)>
.
EDIT: So che se si passa un valore, il thread funzionerà solo sulla copia e non ha alcun effetto dopo il ritorno del thread. Questa non è la mia preoccupazione. Voglio sapere il motivo per cui sta dando l'errore ora, ma non stavo dando errore altri post su SO come la seguente: Difference between pointer and reference as thread parameter
@Barry, hai perso "la porzione evidenziata" con la tua modifica. –
@JonathanWakely risolto. – Barry