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