【问题标题】:How to return a reference, then increment iterator如何返回引用,然后递增迭代器
【发布时间】:2018-01-12 10:21:50
【问题描述】:

请考虑以下代码:

struct Foo
{
    //some useful unique data
};

std::vector<Foo> foos;
std::vector<Foo>::iterator foo_iter;
//populate with a load of Foo objects.

Foo& getNextFoo()
{
    return *foo_iter++;
}

正如您所料,我希望getNextFoo() 做的是取消对迭代器的引用,返回一个引用,然后发布递​​增迭代器。

我不相信这会奏效,而且我对运算符优先级有点模糊,希望得到一些关于如何实现这一点的指导

【问题讨论】:

  • 如果它让你感到困惑,它可能会让其他人感到困惑。我们并非都是运算符优先级专家。两条线有什么问题,让我们这些愚蠢的人很容易追上你?
  • 对我来说似乎很好...您是否进行了任何测试,结果出乎意料? @systemcpro 没有简洁的方法可以在单独的语句中执行此操作,因为增量在逻辑上位于 return 语句之后,这在实际的 c++ 代码中当然不会发生
  • 也许我也应该在下面的答案中提到括号。这对我来说比查找运算符优先规则更容易阅读。任何真正不依赖于真正了解运算符优先级的私密细节的东西。我们不是专家。
  • 编写好的代码是关于它的可维护性。能够在 6 个月内返回并查看它并且不质疑是否存在错误的能力很重要。因此,+1 到 2 行。
  • 我最初是在一个更大的项目中编写此代码,但是是的,我编写了一个快速测试程序并且一切正常。我只是不相信它会按照我的想法做。在询问之前不写测试是我的不良做法。

标签: c++ stl operators


【解决方案1】:
Foo& getNextFoo()
{
    return *foo_iter++;
}

后增量运算符has higher precedence 比取消引用,所以这将按您的意愿工作。

如果你想让它更明确,你也可以说

return *(foo_iter++);

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2021-10-06
    • 2017-07-24
    • 2021-05-09
    • 1970-01-01
    相关资源
    最近更新 更多