Il codice muggito compila e funziona come previsto. La struttura (classe) A
deriva da std::thread
e si espande con uno int
in più. Il codice main
crea alcuni thread e in seguito li attende per terminare.errore: uso della funzione eliminata 'std :: thread :: thread (const std :: thread &)'
Il problema è che, mentre il codice viene compilato senza un distruttore in struct A
, quando il distruttore è commentata (~A(){}
) ottengo:
error: use of deleted function ‘std::thread::thread(const std::thread&)'
e non ho idea sul perché.
Inoltre non capisco perché il codice funzioni entrambi con push_back
e con emplace_back
mentre in base a ciò che ho capito non dovrebbe funzionare con push_back
.
#include <iostream>
#include <thread>
#include <vector>
struct A : std::thread {
int i;
A(void f(const char*),const char* s,int i_) : std::thread{f,s},i{i_}{
std::cout<<"A created"<<std::endl;
}
//~A(){} // uncomment to see error
};
void dosomething(const char* s){
std::cout<<s<<std::endl;
}
int main(){
std::vector<A> aa;
aa.emplace_back(&dosomething,"hi people",3434);
aa.push_back(A(&dosomething,"hi again people",777));
aa.emplace_back(&dosomething,"hi again people",777);
aa.push_back(A(&dosomething,"hi again people",777));
for(auto& i:aa) i.join();
}
Quale versione del compilatore e opzioni? Sono sospettoso che potrebbe trattarsi di un bug del compilatore. – cdhowie
Per quanto riguarda il motivo per cui funziona con 'push_back', credo che la tua struct' A' sia idonea per la generazione automatica di un costruttore di move, quindi 'push_back' sarebbe move-costruendo il' A' nel vettore dal temporaneo che si passa . (Si noti che c'è un sovraccarico di 'push_back (value_type &&)!) – cdhowie
-g; -O0; -Wall; -std = C++ 14; -pthread entrambi usando g ++ e clang ++ e usando anche -std = c + +11 – user3723779