【发布时间】:2014-06-24 08:20:58
【问题描述】:
在 C++ 中,您可以将间接运算符加倍:
vector<unique_ptr<string>> arr{make_unique<string>("Test")};
cout << **arr.begin() << endl;
但是你不能把解引用操作符加倍:
cout << arr.begin()->->c_str() << endl;
相反,您必须接受这个 (IMO) 不太清晰的替代方案:
cout << (*arr.begin())->c_str() << endl;
operator-> 是一个返回指针类型的一元运算符,因此能够将它们链接起来似乎很自然。这种限制有什么好的理由吗?是否有一些我没有看到的解析困难?
编辑
在 5.2.5/3 中,C++ 标准规定:
如果 E1 的类型是“指向 X 类的指针”,那么表达式 E1->E2 是 转换为等价形式 (*(E1)).E2
我只是希望它被指定为:
如果 E1 的类型是“指向 X 类的指针”,那么表达式 E1-> 是 转换为等价形式 (*(E1))。
实际上包含 E1 和 E2 的定义似乎是相反的,因为重载的 operator-> 不是二元运算符。
【问题讨论】:
-
<<与 2*<不同... -
那将是一些完全令人困惑的语法
-
你不能“加倍”
*。您可以应用一次,然后再将其应用到结果中。->也是如此,例如你可以做it->first->foo。->->将是一个全新的运营商,其收益甚至比->已经拥有的更少。 -
@anishsane 确实,但在语法上这很愚蠢。 2个相同的字母是坏的。有人应该给出“a->b”的推理是“(*a).b”的简写,所以 ->-> 没有意义
-
OP 这是一篇有用的文章:boredzo.org/pointers
标签: c++