Zasada, która foo->bar
jest równa, (*foo).bar
dotyczy tylko wbudowanych operatorów.
Unary operator *
nie zawsze ma semantykę dereferencji wskaźnika. Mógłbym stworzyć bibliotekę, w której oznacza to transpozycję macierzy, zero lub więcej dopasowań parsera lub cokolwiek innego.
Sprawiłoby to, że język byłby bardziej kłopotliwy, gdyby coś, co przeciąża jednoargumentowo operator *
, nagle zyskałoby coś, o operator ->
co nie prosiłeś, z semantyką, która może nie mieć sensu.
operator ->
jest osobno przeciążalny, więc jeśli chcesz, możesz przeciążyć jeden przy minimalnym wysiłku.
Zauważ też, że takie przeciążenie miałoby pewne dość interesujące właściwości, takie jak automatyczne łączenie operator ->
wywołań, dopóki jeden w łańcuchu nie zwróci surowego wskaźnika. Jest to bardzo przydatne w przypadku inteligentnych wskaźników i innych typów proxy.
#include <boost/make_shared.hpp>
#include <boost/shared_ptr.hpp>
#include <string>
#include <iostream>
#include <ostream>
struct Foo
{
boost::shared_ptr<std::string> operator -> () const
{
return boost::make_shared<std::string>("trololo");
}
};
int main()
{
Foo foo;
std::cerr << foo->size() << std::endl;
}