【问题标题】:Return type of a bi-dereferenced iterator双解引用迭代器的返回类型
【发布时间】:2016-01-19 16:35:10
【问题描述】:

在大学的一次测试中,我遇到了这个关于 STL,C++ 版本 98 中的列表的问题:

鉴于这些行:list<A*> l; l.push_back(new A); 调用**(l.begin())的返回类型?

在可用的答案中,有AA&(其他的不相关)。

我以为是A,但教授说是A&

我了解到迭代器的取消引用会返回对列表元素的引用,因此*(l.begin()) 应该返回一个类型为(A*)& 的对象。
然后像**(l.begin()) 这样的另一个解引用应该“通过”列表容器给出的引用,甚至通过指向A 的指针,最终返回A 类型的对象。

正确的解释是什么?请提供解释。

【问题讨论】:

  • AA& 很不一样,没有解释的余地​​,你可以试试看
  • @tobi303 我知道变量和对变量的引用之间的区别。请再次阅读我的问题。还是谢谢你。

标签: c++ stl c++98 listiterator


【解决方案1】:

如果pA* 类型,那么*pA& 类型。

如果pA*& 类型(对指针的引用),那么*p 也是A& 类型。

如果x 属于type list<T>::iterator,则*x 属于T& 类型,如果T==A*,则**x 属于A& 类型。

【讨论】:

  • 感谢您的编辑,内森。我不知道这种能力。有没有关于这个降价/标记的文档?
  • 有一个“?”编辑工具栏最右侧、编辑区域上方的图标。
  • 好的。我看到一个“帮助”按钮。感谢您引起我的注意!
  • @AdiLevin 根据我对 C 的了解,由于 C 和 C++ 在指针管理方面应该没有任何区别,所以当您取消引用指针时,您会得到一个 ,并且 不是 对值的引用。所以如果pA* 类型,那么*pA 类型。
    请提供一些来源来说明C++ 中的不同行为。
【解决方案2】:

section 5.3.1你可以找到

一元 * 运算符执行间接:它要指向的表达式 应用的应该是一个指向对象类型的指针,或者一个指向 函数类型,结果是一个引用对象的 lvalue 或 表达式指向的函数。如果表达式的类型 是“指向T的指针”,结果的类型是“T”。

【讨论】:

  • 完全没用,与我的问题无关。
  • @bebo 对不起,我的帖子没用。我发现你的问题很有趣,我尝试在 c++ 参考手册中找到对你教授所说内容的解释。
  • 感谢您的努力。我认为您的回答毫无用处,因为它没有回答我的疑问,因为它只是手册中的引文。如果您公开您对我的问题的想法并链接一些来源,我可以接受您的回答。
猜你喜欢
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
相关资源
最近更新 更多