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;
};

更新於:2020 年 2 月 10 日

286 次瀏覽

開啟你的 職業

完成課程,獲得認證

開始
廣告