2009-08-19 11 views
6

Se io definisco un proprio operatore di assegnamento, che ha una firma diversa rispetto l'operatore di assegnazione di default normalmente generato:Quando l'operatore di assegnazione predefinito C++ diventa inaccessibile?

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

fa l'operatore di assegnamento di default, in questo caso operator = (A&) (o simili, mi corregga se sbaglio) diventare indefinito/inaccessibile?

AFAIK questo è vero per il costruttore predefinito, che non esiste, se definiamo qualche altro costruttore. Ma non sono davvero sicuro se questo è il caso per le altre impostazioni predefinite "magiche".

La ragione per cui lo chiedo: voglio evitare che il costruttore di copie predefinito venga accidentalmente chiamato tramite una conversione di tipo implicita. Se non esiste, non potrebbe mai accadere.

risposta

12

No. 12,8/9 dice che l'operatore di assegnazione per la classe X deve essere non statico, non modello con un parametro di tipo X, X &, X const &, X volatili & o X const volatili &. E c'è una nota che sottolinea che l'istanziazione di un modello non sopprime la dichiarazione implicita.

+0

Grazie per il riferimento standard! Questo in realtà dice qualcosa di più dei miei esempi. – xtofl

+0

Hai ragione. Cancellerò la mia risposta. –

+0

@Neil, ti sei chiesto quale sia l'uso = l'impostazione predefinita potrebbe essere. Uno è quello di essere espliciti in ciò che è disponibile, un altro è quello di modificare l'accessibilità di un terzo è che permette di rendere l'implementazione non in linea pur garantendo che l'evoluzione della classe non lo infranga. Un'altra giustificazione è che la funzionalità è più ampia dell'ambito di competenza dell'assegnazione e non vi era alcun incentivo a fare un'eccezione anche se non fosse stata utile. – AProgrammer

4

Poiché A& operator=(B&) non ha la firma di A& operator=(const A&), ciò non fa nulla per l'operatore di assegnazione sintetizzato.

Dai uno sguardo allo this snippet at codepad.org - per quanto un esempio vale come prova.

Test di guida Comeau con esso mostra anche che A& operator=(const A&) è sintetizzato.

+0

Esempio molto interessante. Farò l'operatore di assegnazione copia predefinito privato per essere sicuro. – hirschhornsalz

1

AFAIK questo è vero per il costruttore predefinito, che non esiste, se definiamo qualche altro costruttore. Ma non sono davvero sicuro se questo è il caso per le altre impostazioni predefinite "magiche".

L'impostazione predefinita costruttore di copia non saranno interessati dalla disposizione di un altro costruttore ...

Il motivo che mi chiedo: voglio evitare che il costruttore di copia di default viene accidentalmente chiamato attraverso un tipo di implicita conversione. Se non esiste, non potrebbe mai accadere.

... o operatore di assegnazione. Ad esempio:

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

Per disabilitare il costruttore di copie predefinito, dichiararlo (non è necessario implementare, ovviamente) come privato. Per quanto riguarda il tuo caso d'uso, potresti anche voler dare un'occhiata alla parola chiave "esplicita" per sopprimere la conversione automatica dei tipi.

Problemi correlati