这是返回迭代器元素并发布增量的有效方法吗



我的类(我们称之为A(接受一个string::iterator,它实现了两个方法:

  • auto peek() const -> const char &:返回对当前位置数据的引用
  • auto get() -> const char &:返回对当前位置处数据的引用,然后递增该位置

我提出的解决方案如下:

class A {
std::string::iterator _s;
public:
A() = delete;
explicit A(std::string::iterator s) : _s(s) {}
auto peek() const -> const char & {
return *_s;
}
auto get() -> const char & {
return *(_s++);  // <-- valid?
}
};

在这种情况下,我理解返回值的临时副本也可以,因为char的大小足够小:

auto get2() -> char {
const auto c = *_s;
_s++;
return c;
}

然而,假设数据足够大,以至于我想返回引用而不是复制。下面的代码是在C++中实现这一点的有效方法吗?

auto get() -> const char & {
return *(_s++);
}

是的,只要s是一个有效的迭代器(即string是活动的,并且sstring的有效迭代器范围内(,return *(_s++);是完全有效和安全的。

_s++将递增s,返回一个新的iterator,该CCD_13是递增前s副本

然后,*解引用复制iterator,从而产生对s最初在string中引用的char的非常量char&引用。

然后将该引用作为const char&引用原样发送给调用者,这非常好。

即使你不想相信这个逻辑,你使用局部变量的方法也很好,你可以通过简单地将变量声明为引用而不是值来返回引用,例如:

auto get() -> const char & {
const char &c = *_s;
++_s;
return c;
}

最新更新