Je parcourais la section 13.5 après réfutant l'idée que construit-dans les opérateurs ne pas participer à la résolution de surcharge, et a remarqué qu'il n'y a pas de section sur operator->*
. C'est juste un générique opérateur binaire.
Ses frères, operator->
, operator*
, et operator[]
, sont tous obligés d'être non-fonctions membres statiques. Cela s'oppose à la définition d'une fonction libre de surcharge d'un opérateur couramment utilisé pour obtenir une référence d'un objet. Mais le rare operator->*
est à gauche.
En particulier, operator[]
a de nombreuses similitudes. Il est binaire (ils ont raté une occasion en or de faire n-aire), et il accepte un certain type de conteneur sur la gauche et une sorte de repérage sur la droite. Particulière-section règles, 13.5.5, ne semble pas avoir d'effets réels à l'exception de hors la loi gratuit fonctions. (Et cette restriction, même s'oppose à l'appui de la commutativité!)
Ainsi, par exemple, c'est parfaitement légal:
#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;
}
Il est facile de trouver des utilisations, mais la syntaxe alternative tend à ne pas être si mauvais que ça. Par exemple, l'échelle des indices pour 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
L'a fait le comité des normes de l'oublier pour éviter cela, était-il trop laid pour la peine, ou il y a les cas d'utilisation réels?