c_str() c_str() 是返回指针类型的一元运算符,因此能够将它们链-6ren">
gpt4 book ai didi

c++ - C++ 不允许将 -> 运算符加倍有什么充分的理由吗?

转载 作者:行者123 更新时间:2023-11-28 02:48:48 24 4
gpt4 key购买 nike

在 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++ 标准规定:

If E1 has the type “pointer to class X,” then the expression E1->E2 is converted to the equivalent form (*(E1)).E2

我只是希望它被指定为:

If E1 has the type “pointer to class X,” then the expression E1-> is converted to the equivalent form (*(E1)).

这个定义包含 E1 和 E2 实际上似乎是相反的,因为重载的 operator-> 不是二元运算符。

最佳答案

这是一个不太技术性的解释。

->(*someptr).memberfunc()*. 的简写.因此这可以表示为 someptr->memberfunc()

在您的示例中,两个 ->(*(*arr.begin()).).c_str() 相同。注意额外的点。这没有意义,也无法编译,因为 .是二元运算符,*是一元运算符。因此,你会有一个“额外”的点。您确实需要两个 * 而只有一个 .。按照您的做法使用一个 -> 和一个 *

-> 表示“取消引用并获得成员”。你想取消引用两次,并获得一个成员一次,所以双 -> 不是你想要的。

关于c++ - C++ 不允许将 -> 运算符加倍有什么充分的理由吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23516402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com