Không tồn tại toán tử nào tên là ?-->? trong C++. Đôi khi ta cần tạo kiểu wrapper (bọc). Ví dụ: unique_ptr, shared_ptr, optional và các kiểu tương tự. Thường các kiểu này có hàm thành viên truy cập tên .get nhưng cũng cung cấp operator-> để hỗ trợ truy cập trực tiếp giá trị bên trong tương tự con trỏ thường.
Vấn đề là đôi khi có vài kiểu này lồng nhau. Điều này nghĩa là ta cần gọi .get nhiều lần hoặc nhiều toán tử giải tham chiếu cho đến khi đạt giá trị.
Ví dụ:
wrapper<wrapper<std::string>> wp;
wp.get().get().length();
wp.get()->length();
Hơi xấu. Nếu thay một .get() bằng mũi tên thì tốt, nếu có thể thay cái thứ hai cũng tốt. C++98 giới thiệu toán tử mũi tên dài (long arrow operator).
wrapper<wrapper<std::string>> wp;
wp--->length();
Nếu có lớp bọc khác? Chỉ cần mũi tên dài hơn.
wrapper<wrapper<wrapper<std::string>>> wp;
wp----->length();
Mũi tên dài không phải toán tử đơn lẻ, mà tổ hợp nhiều toán tử. Trong trường hợp này, toán tử -> thường và toán tử giảm hậu tố --.
Vì vậy, khi viết wp---->length(), trình biên dịch thấy ((wp--)--)->length().
Nếu định nghĩa hậu tố -- giống toán tử giải tham chiếu, ta có mũi tên dài, thậm chí mũi tên dài hơn:
template <typename T>
class wrapper {
public:
T* operator->() { return &t; }
T& operator--(int) { return t; }
private:
T t;
};