Sind freie Betreiber->* überlastungen böse?

Ich war durchlesen Abschnitt 13.5 nach Widerlegung der Vorstellung, die built-in-Operatoren nicht an der überlast Auflösung, und festgestellt, dass es kein Abschnitt auf operator->*. Es ist nur ein generischer binärer operator.

Seine Brüder, operator->, operator*, und operator[] notwendig, um nicht-statische member-Funktionen. Dies schließt die definition eines freie Funktion überladen, um einen operator Häufig verwendet, um eine Referenz von einem Objekt. Aber die ungewöhnlich operator->* übrig ist.

Insbesondere operator[] hat viele Gemeinsamkeiten. Es ist binären (Sie verpasste eine goldene Gelegenheit, um es n-ary), und es übernimmt eine Art container auf der linken und eine Art von locator auf der rechten Seite. Seinen besonderen Regeln Abschnitt 13.5.5, nicht scheinen, um eine tatsächliche Wirkung, außer zu ächten Kostenlose Funktionen. (Und diese Einschränkung schließt auch Unterstützung für commutativity!)

So, zum Beispiel, das ist vollkommen 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 leicht zu finden verwendet, sondern alternative syntax, neigt nicht so schlimm zu 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

Hab den standards committee vergessen, um dies zu verhindern, wurde es als zu hässlich, zu stören, oder gibt es real-world use cases?

  • Ein Datenpunkt: Coneau (comeaucomputing.com/tryitout) lehnt Ihren code auch nachdem ich den entfernt <type_traits> und der erste operator: error: no operator "->*" matches these operands
  • Comeau war der erste Ort, den ich ging, um zu versuchen und zu sehen. Ich habe noch diese tab zu öffnen... der einzige code, den ich vor dem Wechsel zu GCC 4.5 wurde "struct x { int y; }; int & - operator->*( x &l, int r ) { return l.y; } void f() { x q; int &i = q->*3; }". — und es gibt Erfolge für das wichtigste Beispiel minus alles abhängig von der ersten type_traits abhängigen überlast.
  • Ich weiß nicht, warum Betreiber->* können überladen werden, aber es sieht sicher hella hässlich! Ich würde bleiben Weg von es aus dem gleichen Grund wie überlastung durch Komma scheint es nicht so intuitiv zu C++.
Schreibe einen Kommentar