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 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.