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 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告