C++ 中的 ?--> 運算子是什麼?
C++ 中沒有這樣的運算子。有時,我們需要建立包裝型別。例如,unique_ptr、shared_ptr、optional 等型別。通常,這些型別有一個訪問成員函式名為 .get,但它們還提供了運算子 → 來支援直接訪問包含的值,類似於普通指標所做的那樣。
問題有時是我們有一些這些型別相互巢狀。這意味著我們需要多次呼叫 .get 或有很多解引用運算子,直到我們得到值。
類似於以下內容:
wrapper<wrapper<std::string>> wp; wp.get().get().length(); wp.get()->length();
這可能會有點難看。如果我們可以用一個箭頭替換一個 .get(),那麼如果我們能也能替換第二個 .get(),那就好了。為此,C++98 引入了長箭頭運算子。
wrapper<wrapper<std::string>> wp; wp--->length();
如果我們有另一層包裝怎麼辦?只需做一個更長的箭頭。
wrapper<wrapper<wrapper<std::string>>> wp; wp----->length();
長箭頭不是單個運算子,而是多個運算子的組合。在本例中,一個普通的 -> 運算子和後置遞減運算子 --。
因此,當我們編寫 wp----→length() 時,編譯器會看到 ((wp--)--)→length()。
如果我們將後置 -- 定義為與解引用運算子相同,則我們會得到長箭頭,甚至是更長的箭頭運算子 −
template <typename T> class wrapper { public: T* operator->() { return &t; } T& operator--(int) { return t; } private: T t; };
廣告