9

Beim Erstellen eines Threads, der eine Memberfunktion aufruft, besteht ein Unterschied zwischen der Übergabe eines Zeigers an die aktuelle Klasse oder der Übergabe einer Referenz?std :: thread constructor Gibt es einen Unterschied zwischen der Übergabe eines Zeigers und der Übergabe an ref?

Verhält sich method1 im folgenden Beispiel genauso wie method2? Gibt es Unterschiede?

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

Angenommen es kompiliert, sollte es nicht sein. Referenzen sind syntaktischer Zucker für Zeiger. Das heißt aber nicht, dass es den Compiler nicht vermasseln könnte, da es syntaktisch zweifelhaft ist, den 'std :: ref'' reference_wrapper' zu übergeben, wenn der Aufruf (intern) mit 'this' als Zeiger als erstes Objekt ausgeführt wird. – ShadowRanger

Antwort

4

Nein, gibt es keine Unterschiede, aber beachten Sie, dass eine Referenz Wrapper nur möglich geworden ist std::ref mit der Annahme der LWG 2219 als Mängelbericht am Oktober 2015 WG21 Sitzung. *

Verwendung helfen können in Fällen, in denen Sie eine benannte Objektinstanz anstelle von this haben, da this ziemlich einfach zu buchstabieren ist. Aber betrachten Sie die folgende Situation, in der Sie schön konst korrigieren bleiben möchten:

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

Dies einfacher sein kann, lesen als:

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); 

*) Anbieter, die unterschiedliche Sprache Dialekte halten herum, wie GCCs und Clang mit dem -std Flag), wird in der Regel Fehler für alle Dialekte gelten und "reparieren" die Implementierungen. Defekte sind Dinge, die "immer so gemeint waren, wie wir es jetzt sagen".

+0

Das 'std :: ref' Beispiel sollte nicht einmal kompilieren, * INVOKE * hat keine spezielle Behandlung für' reference_wrapper' - https://cplusplus.github.io/LWG/lwg-defects.html#2219 – Praetorian

+0

Glad Sie nicht gelöschte :) Sieht so aus, als ob es sehr kürzlich zu libstdC++ hinzugefügt wurde - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59768 – Praetorian

+0

Es ist tatsächlich im Arbeitsentwurf jetzt, nur N4567 und seine Definition betrachtet von * INVOKE * beinhaltet die Behandlung 'reference_wrapper' – Praetorian

Verwandte Themen