2010-10-14 7 views
21

Ci sono 4 operatori in C++ che possono essere sovraccaricati ma non possono essere sovraccaricati come funzioni indipendenti (ovvero non membri, standalone). Questi operatori sono:Razionale di imporre alcuni operatori per essere membri

  • operator =
  • operator()
  • operator ->
  • operator []

This thread spiega perfettamente la logica alla base vieta operator = essere una funzione non membro. Qualche idea sugli altri tre?

+3

Sono abbastanza sicuro che '-> *' può essere implementato come una funzione non membro. –

+2

@James: hai ragione. @Armen: Probabilmente solo miopia. – GManNickG

+0

@James. Il libro C++ in breve dice diversamente ... –

risposta

18

I quattro operatori menzionati nel messaggio originale, =, (), -> e [], devono infatti essere implementate come funzioni membro non statiche (rispettivamente C++ 98 §13.5.3/1, §13.5.4/1, §13.5.5/1 e §13.5.6/1).

Bjarne Stroustrup era, come ricordo da precedenti discussioni sull'argomento, mantenere un po 'di buonsenso nella lingua, cioè avere almeno alcune cose su cui fare affidamento indipendentemente da quanto Qualcuno Else abbia rovinato definendo non- operatori membri per le classi esistenti.

Non sono sicuro di essere completamente d'accordo sul fatto che la restrizione sia davvero d'aiuto, ma.

EDIT: Ho consultato Bjarne Stroustrup su questo (è sempre utile) ma sembra che le apparenti incoerenze delle regole non siano altro che un caso di incidente storico congelato. Egli osserva che "ora sembra peggio di quanto non fosse perché le regole per lvalue e riferimenti sono cambiate da quando sono state formulate le regole di sovraccarico. Ho cercato di esaminare nuovamente questo problema un paio di anni fa, ma ho perso tempo prima di produrre un proposta completa. "

Acclamazioni & hth,

PS:. "La progettazione e evoluzione del C++" libro è grande per questo tipo di domanda, ma purtroppo non averlo.

+0

E che cosa esattamente in questo caso è la differenza principale tra -> e -> *? Perché non si può essere non membri mentre l'altro può? Sono comunque aperto a risposte del tipo "non c'è una ragione seria, è illogico, ma è così che è", anche se sarei certamente deluso se fosse il caso –

+0

@Armen: bella domanda. Non lo so. Forse questo è spiegato "The Design and Evolution", e se è così, forse qualcuno che ha quel libro sarà inserito. Ho controllato il vecchio ARM, non sembra discuterlo. –

+0

La logica per '=' è presentata in D & E ed è valida fino ad oggi. Non so perché questa restrizione è stata imposta anche a '()', '[]', e '->' però. – AnT

2

Questo thread su comp.std.C++ discute la domanda.

Francesco Glassborow, che era parte del comitato, ha dichiarato:

I progettisti di linguaggi non volevano sostenere conversioni e promozioni sul operando sinistro dell'operatore =, nè tali sul operando di() e [].

Cercando di evitare la situazione in cui:

class A {}; 

class B { B(A& a) {} }; 

int operator()(B const& b) { return 0; } 


int main(void) 
{ 
    A a; 

    // This works even though A doesn't have a() operator 
    // It creates a temporary B and calls operator()(B& b) 
    return a();     
} 
+3

Nit: avresti bisogno di 'int operator() (B const & b)' per evitare di provare a associare un riferimento temporaneo a un non-'constst'. Ad ogni modo, la domanda di Armen su '-> *' è ancora valida. –

+2

"I progettisti di linguaggi non volevano supportare conversioni e promozioni nell'operando di sinistra di()". Tuttavia lo fanno quando una classe dichiara una funzione di conversione alla funzione puntatore-a ... –

+0

@Alf Grazie - modificato. – Dingo

Problemi correlati