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

开启你的 职业

完成课程,获得认证

开始
广告