9

Quando si crea un thread che chiama una funzione membro, c'è una differenza tra passare un puntatore alla classe corrente o passare un riferimento?std :: costruttore di thread C'è una differenza tra passare un puntatore e passare per ref?

Dall'esempio seguente, metodo1 si comporta come metodo2? Ci sono delle differenze?

class MyClass 
{ 
public: 
    MyClass(){}; 
    ~MyClass(){}; 
    void memberFunction1() 
    { 
     //method 1 
     std::thread theThread(&MyClass::memberFunction2, this, argumentToMemberFunction2) 

     //method 2 
     std::thread theThread(&MyClass::memberFunction2, std::ref(*this), argumentToMemberFunction2) 
    } 
    void memberFunction2(const double& someDouble){}; 
} 
+2

Supponendo che compili, non ci dovrebbe essere. I riferimenti sono zucchero sintattico per i puntatori. Non significa che non potrebbe rovinare il compilatore, dato che è sintatticamente discutibile passare il 'std :: ref'' reference_wrapper' quando la chiamata viene eseguita (internamente) con 'this' come puntatore come primo oggetto. – ShadowRanger

risposta

4

No, non ci sono differenze, ma è da notare che l'utilizzo di un involucro di riferimento è diventato possibile solo con l'accettazione di LWG 2219 come rapporto difetto al ottobre 2015 WG21 incontro. *

Utilizzando std::ref può aiutare nei casi in cui si dispone di un'istanza dell'oggetto con nome anziché di this, poiché this è abbastanza facile da pronunciare. Ma si consideri la seguente situazione, in cui si desidera rimanere ben const-corretto:

A a; 
std::thread(&A::foo, std::cref(a), 1, 2); 

Questo può essere più facile da leggere rispetto:

std::thread(&A::foo, &(const_cast<const A&>(a)), 1, 2); 
std::thread(&A::foo, &as_const(a), 1, 2); 
std::thread(&A::foo, const_cast<const A*>(&a), 1, 2); 

*) I fornitori che mantengono distinti dialetti della lingua in giro, come GCC e Clang con il flag -std, generalmente considerano i difetti da applicare a tutti i dialetti e "correggono" le implementazioni. I difetti sono cose che "sono sempre state pensate come il modo in cui ora diciamo".

+0

L'esempio 'std :: ref' non dovrebbe nemmeno compilare, * INVOKE * non ha una gestione speciale per' reference_wrapper' - https://cplusplus.github.io/LWG/lwg-defects.html#2219 – Praetorian

+0

Glad non cancellato :) Sembra che questo sia stato aggiunto molto recentemente a libstdC++ - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59768 – Praetorian

+0

E 'davvero nella bozza di lavoro ora, basta guardare N4567 e la sua definizione di * INVOKE * include la gestione di 'reference_wrapper' – Praetorian

Problemi correlati