2010-10-14 2 views
21

Il existe 4 opérateurs en C++ qui peuvent être surchargés mais ne peuvent pas être surchargés en tant que fonctions indépendantes (alias non-membre, autonome). Ces opérateurs sont:Justification de l'application de certains opérateurs à des membres

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

This thread explique parfaitement la raison d'être interdisant operator = être une fonction non-membre. Des idées sur les trois autres?

+3

Je suis assez sûr '-> *' peut être mis en œuvre en fonction non-membre. –

+2

@James: Vous avez raison. @Armen: Probablement juste myopie. – GManNickG

+0

@James. Le livre C++ en un mot dit autrement ... –

Répondre

18

Les quatre opérateurs mentionnés dans le message original, =, (), -> et [], doivent en effet être mis en oeuvre en tant que fonctions membres non statiques (par respectivement 98 §13.5.3/1 C++, §13.5.4/1, §13.5.5/1 et §13.5.6/1). Si je me souviens bien des précédents débats sur le sujet, Bjarne Stroustrup a eu raison de garder une certaine lucidité dans la langue, c'est-à-dire d'avoir au moins des choses sur lesquelles on peut compter, quel que soit le problème. opérateurs membres pour les classes existantes.

Je ne suis pas sûr que je suis entièrement d'accord que la restriction aide vraiment à cela, mais. : J'ai consulté Bjarne Stroustrup à ce sujet (il est toujours utile) mais il semble que les incohérences apparentes des règles ne sont rien de plus qu'un accident historique figé. Il note que "Cela semble pire maintenant qu'à l'époque parce que nos règles pour les valeurs et les références ont changé depuis que les règles de surcharge ont été formulées.J'ai essayé de réexaminer cette question il y a quelques années, mais j'ai manqué de temps avant de produire un compléter la proposition. "

Vive & HTH,

PS:. « La conception et l'évolution de C++ » livre est idéal pour ce genre de question, mais malheureusement, je ne l'ai pas.

+0

Et quoi exactement dans ce cas est la principale différence entre -> et -> *? Pourquoi on ne peut pas être un non membre alors que l'autre le peut? Je suis par ailleurs ouvert à des réponses comme "il n'y a pas de raison sérieuse, c'est illogique, mais c'est comme ça", même si je serais certainement déçu si c'était le cas –

+0

@Armen: bonne question. Je ne sais pas. Peut-être que cela est expliqué "Le Design et l'Évolution", et si oui, peut-être que quelqu'un qui a ce livre va entrer. J'ai vérifié dans le vieux bras, il ne semble pas en discuter. –

+0

La justification de '=' est en effet présentée dans D & E et elle est valide à ce jour. Je ne sais pas pourquoi cette restriction a aussi été imposée à '()', '[]' et '->'. – AnT

2

Cette thread sur comp.std.C++ traite de la question.

Francis Glassborow, qui était membre du comité, a déclaré:

Les concepteurs de langue ne veulent pas soutenir les conversions et promotions sur l'opérande gauche de l'opérateur =, ni comme l'opérande de() et [].

Essayer d'éviter la situation où:

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: vous auriez besoin de 'int operator() (B const & b)' pour éviter d'essayer de lier un temporaire à une référence à non-'const'. Quoi qu'il en soit, la question d'Armen à propos de '-> *' est toujours valable. –

+2

"Les concepteurs de langage ne voulaient pas supporter les conversions et les promotions sur l'opérande gauche de()". Cependant, ils permettent que lorsqu'une classe déclare une fonction de conversion à pointeur-à ... –

+0

@Alf Merci - modifié. – Dingo

Questions connexes