Quy tắc foo->bar
bằng (*foo).bar
chỉ giữ cho các toán tử dựng sẵn.
Unary operator *
không luôn luôn có ngữ nghĩa của con trỏ. Tôi có thể tạo một thư viện trong đó nó có nghĩa là hoán vị ma trận, phù hợp với trình phân tích cú pháp không hoặc nhiều hơn, hoặc khá nhiều thứ.
Nó sẽ làm cho ngôn ngữ trở nên khó chịu hơn nếu bất cứ điều gì quá tải unary operator *
sẽ đột nhiên đạt được một thứ operator ->
bạn không yêu cầu, với ngữ nghĩa có thể không có ý nghĩa.
operator ->
là quá tải riêng biệt, vì vậy nếu bạn muốn một cái, bạn có thể quá tải một cái với nỗ lực tối thiểu.
Cũng lưu ý rằng quá tải như vậy sẽ có một số thuộc tính khá thú vị, như tự động thực hiện operator ->
các cuộc gọi cho đến khi một trong chuỗi trả về một con trỏ thô. Điều này khá hữu ích cho các con trỏ thông minh và các loại proxy khác.
#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;
}