Aturan yang foo->bar
sama (*foo).bar
hanya berlaku untuk operator builtin.
Unary operator *
tidak selalu memiliki semantik penunjuk pointer. Saya bisa membuat perpustakaan yang artinya transposisi matriks, nol atau lebih cocok parser, atau cukup banyak apa pun.
Itu akan membuat bahasa lebih menyusahkan jika sesuatu yang membebani unary operator *
tiba-tiba akan mendapatkan yang operator ->
tidak Anda minta, dengan semantik yang mungkin tidak masuk akal.
operator ->
secara terpisah kelebihan beban, jadi jika Anda menginginkannya, Anda dapat membebani satu dengan upaya minimal.
Perhatikan juga bahwa kelebihan seperti itu akan memiliki beberapa sifat yang agak menarik, seperti operator ->
panggilan chaining secara otomatis sampai satu di rantai mengembalikan pointer mentah. Ini cukup berguna untuk pointer cerdas dan tipe proxy lainnya.
#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;
}