Ich war Abschnitt 13,5 nach refuting the notion, dass eingebaute Operatoren nicht in Überladung Auflösung teilnehmen, und bemerkte, dass es keinen Abschnitt auf operator->*
. Es ist nur ein generischer binärer Operator.Sind freie Betreiber -> * Überlasten böse?
Seine Brüder, operator->
, operator*
, und operator[]
, müssen alle nicht-statische Elementfunktionen sein. Dies schließt die Definition einer Überladung einer freien Funktion für einen Operator allgemein aus, der verwendet wird, um eine Referenz von einem Objekt zu erhalten. Aber die seltene operator->*
ist weggelassen.
Insbesondere hat operator[]
viele Ähnlichkeiten. Es ist binär (sie haben eine goldene Gelegenheit verpasst, es n-ary zu machen), und es akzeptiert eine Art von Container auf der linken Seite und eine Art von Locator auf der rechten Seite. Der Abschnitt zu Sonderregeln, 13.5.5, scheint keine tatsächlichen Auswirkungen zu haben, außer um freie Funktionen zu verbieten. (Und diese Beschränkung schließt auch Unterstützung für commutativity!)
So zum Beispiel, das ist perfectly legal:
#include <utility>
#include <iostream>
using namespace std;
template< class T >
T &
operator->*(pair<T,T> &l, bool r)
{ return r? l.second : l.first; }
template< class T >
T & operator->*(bool l, pair<T,T> &r) { return r->*l; }
int main() {
pair<int, int> y(5, 6);
y->*(0) = 7;
y->*0->*y = 8; // evaluates to 7->*y = y.second
cerr << y.first << " " << y.second << endl;
}
Es ist einfach, Anwendungen zu finden, aber alternative Syntax neigt nicht so schlimm sein. Zum Beispiel skaliert Indizes für vector
:
v->*matrix_width[2][5] = x; // ->* not hopelessly out of place
my_indexer<2> m(v, dim); // my_indexer being the type of (v->*width)
m[2][5] = x; // it is probably more practical to slice just once
Hat der Normenausschuss vergessen, dies zu verhindern, war es zu hässlich als zu stören, oder gibt es reale Anwendungsfälle?
Ein Datenpunkt: Coneau (http://www.comeaucomputing.com/tryitout/) lehnt den Code selbst, nachdem ich entfernt haben '' und der erste Betreiber: 'Fehler: kein Operator„-> * "Entspricht diesen Operanden" –
sbi
@sbi: Comeau war der erste Ort, an den ich gegangen bin. Ich habe immer noch diesen Tab offen ... der einzige Code, den ich vor dem Wechsel zu GCC 4.5 eingegeben habe, war "struct x {int y;}; int & ope rator -> * (x & l, int r) {return l.y; } void f() { x q; int & i = q -> * 3; } ". - und es gibt Erfolg für das Hauptbeispiel minus alles abhängig von dieser ersten type_traits abhängigen Überlastung. – Potatoswatter
Ich weiß nicht, warum Operator -> * kann so überlastet werden, aber es sieht hella hässlich! Ich würde Finger weg von ihm aus dem gleichen Grund wie das Überladen von Komma - es sieht nicht wie intuitives C++ aus. – AshleysBrain