Kural foo->bar
eşittir (*foo).bar
sadece yerleşik operatörler için geçerlidir.
Unary operator *
her zaman işaretçi dereference semantiğine sahip değildir. Matris transpozisyonu, sıfır veya daha fazla ayrıştırıcı eşleşmesi veya hemen hemen her şey anlamına gelen bir kütüphane yapabilirim.
Eğer aşırı yüklenen herhangi bir şeyin operator *
aniden operator ->
istemediğiniz bir şeyi kazanması mantıklı olmayan anlambilim ile dili daha rahatsız edici hale getirecektir.
operator ->
ayrı olarak yüklenebilir, bu yüzden isterseniz, minimum çaba ile bir tane aşırı yükleyebilirsiniz.
Ayrıca, böyle bir aşırı yükün operator ->
, zincirdeki bir ham işaretçi döndürene kadar çağrıları otomatik olarak zincirleme gibi bazı oldukça ilginç özelliklere sahip olacağını unutmayın . Bu, akıllı işaretçiler ve diğer proxy türleri için oldukça kullanışlıdır.
#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;
}