Правило, foo->bar
равное (*foo).bar
только для встроенных операторов.
Унарный operator *
не всегда имеет семантику разыменования указателя. Я мог бы создать библиотеку, в которой это означало бы перестановку матриц, совпадения парсера с нулем или более или почти все что угодно.
Это сделало бы язык более утомительным, если бы все, что перегружало унарный код operator *
, внезапно получило бы operator ->
то, о чем вы не просили, с семантикой, которая может не иметь смысла.
operator ->
может быть перегружен отдельно, поэтому, если вы хотите его, вы можете перегрузить его с минимальными усилиями.
Также обратите внимание, что такая перегрузка будет обладать некоторыми довольно интересными свойствами, такими как автоматическая цепочка operator ->
вызовов, пока один в цепочке не возвратит необработанный указатель. Это очень полезно для умных указателей и других типов прокси.
#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;
}