2009-08-19 9 views
6

Wenn ich einen eigenen Zuweisungsoperator definieren, die eine andere Signatur als der normalerweise generierten Standardzuweisungsoperator hat:Wann wird der C++ - Standardzuweisungsoperator nicht mehr zugänglich?

struct B; 
struct A { 
void operator = (const B& b) { 
    // assign something 
} 
}; 

hat den Standard-Zuweisungsoperator, in diesem Fall operator = (A&) (oder dergleichen, korrigieren Sie mich, wenn falsch) unbestimmt/unzugänglich werden?

AFAIK das gilt für den Standardkonstruktor, der nicht existiert, wenn wir einen anderen Konstruktor definieren. Aber ich bin mir wirklich nicht sicher, ob das bei den anderen "magischen" Vorgaben der Fall ist.

Der Grund, warum ich frage: Ich möchte vermeiden, dass der Standardkopiekonstruktor versehentlich über eine implizite Typkonvertierung aufgerufen wird. Wenn es nicht existiert, könnte es nie passieren.

Antwort

12

No. 12,8/9 sagt, dass der Zuweisungsoperator für Klasse X nicht statisch sein muß, nicht-Vorlage mit einem Parameter vom Typ X, X &, X const &, X oder X volatile & const volatilen &. Und es gibt eine Notiz, die betont, dass die Instanziierung einer Vorlage die implizite Deklaration nicht unterdrückt.

+0

Danke für die Standard-Referenz! Das sagt eigentlich mehr als meine Beispiele. – xtofl

+0

Sie haben Recht. Ich lösche meine Antwort. –

+0

@Neil, haben Sie sich gefragt, was Verwendung = Standard sein könnte. Eine davon ist, in dem, was verfügbar ist, explizit zu sein, ein anderes ist die Zugänglichkeit zu ändern, ein drittes ist, dass es ermöglicht, die Implementierung nicht inline zu machen, während sichergestellt wird, dass die Evolution der Klasse es nicht bricht. Eine weitere Rechtfertigung ist, dass das Merkmal breiter ist als die Zuordnung, und es gab keinen Anreiz, eine Ausnahme zu machen, selbst wenn es keinen Nutzen hätte. – AProgrammer

4

Da A& operator=(B&) nicht die Signatur von A& operator=(const A&) hat, tut dies dem synthetisierten Zuweisungsoperator nichts.

Schauen Sie sich this snippet at codepad.org an - soweit ein Beispiel als Beweis gilt.

Test fahren Comeau damit zeigt auch, dass A& operator=(const A&) synthetisiert wird.

+0

Sehr interessantes Beispiel. Ich werde den Standardkopiezuweisungsoperator privat machen, um sicher zu sein. – hirschhornsalz

1

AFAIK das gilt für den Standardkonstruktor, der nicht existiert, wenn wir einen anderen Konstruktor definieren. Aber ich bin mir wirklich nicht sicher, ob das bei den anderen "magischen" Vorgaben der Fall ist.

Der Standard Copykonstruktor wird nicht durch die Bereitstellung eines anderen Konstruktor ...

Der Grund, warum ich frage betroffen sein: ich, dass der Standard Copykonstruktor vermeiden will versehentlich über einen impliziten Typen genannt wird Umwandlung. Wenn es nicht existiert, könnte es nie passieren.

... oder Zuweisungsoperator. Zum Beispiel:

class A { 
      private: 
      A& operator= (const A& a); // private here means: forbidden operator 
      public: 
      A(int i) {} 
    }; 

    int main() { 
      A a(2); 
      A b(a);   // copy constructor syntax 1 
      A c = a;  // copy constructor syntax 2 
      // Forbidden: A d; 
      // Forbidden: c = a; 
    } 

Um den Standardkopiekonstruktor zu deaktivieren, deklarieren Sie ihn (natürlich nicht implementieren) als privat. In Bezug auf Ihren Anwendungsfall sollten Sie sich auch das Stichwort "explizit" ansehen, um die automatische Typumwandlung zu unterdrücken.

Verwandte Themen