我的类(我们称之为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
是活动的,并且s
在string
的有效迭代器范围内(,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;
}