这是 return 迭代器元素和 post 增量的有效方法吗?
Is this a valid way to return an iterator element and post-increment?
我的 class(我们称它为 A
)接收一个 string::iterator
并实现两个方法:
auto peek() const -> const char &
: Returns 对当前位置数据的引用。
auto get() -> const char &
: Returns 对当前位置数据的引用 然后增加位置。
我想出的解决方案如下:
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?
}
};
在这种情况下,我理解 return 值的临时副本也可以工作,因为 char
的大小足够小:
auto get2() -> char {
const auto c = *_s;
_s++;
return c;
}
但是,假设数据足够大,以至于我想 return 引用而不是复制。以下代码是否是在 C++ 中执行此操作的有效方法?
auto get() -> const char & {
return *(_s++);
}
是的,return *(_s++);
是完全有效和安全的,前提是 s
是一个有效的迭代器(即 string
是有效的,并且 s
是在 string
的有效迭代器范围内。
_s++
将递增 s
,return 生成一个新的 iterator
,它是 [=12= 的 copy ] 在递增之前。
然后 *
取消引用 copied iterator
,产生一个非常量 char&
对 char
的引用 char
s
原来是指内string
.
然后您 return
将调用者的引用原样作为 const char&
引用,这完全没问题。
即使您不想相信这个逻辑,您使用局部变量的方法也很好,您可以 return 通过简单地将该变量声明为引用而不是值来引用,例如:
auto get() -> const char & {
const char &c = *_s;
++_s;
return c;
}
我的 class(我们称它为 A
)接收一个 string::iterator
并实现两个方法:
auto peek() const -> const char &
: Returns 对当前位置数据的引用。auto get() -> const char &
: Returns 对当前位置数据的引用 然后增加位置。
我想出的解决方案如下:
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?
}
};
在这种情况下,我理解 return 值的临时副本也可以工作,因为 char
的大小足够小:
auto get2() -> char {
const auto c = *_s;
_s++;
return c;
}
但是,假设数据足够大,以至于我想 return 引用而不是复制。以下代码是否是在 C++ 中执行此操作的有效方法?
auto get() -> const char & {
return *(_s++);
}
是的,return *(_s++);
是完全有效和安全的,前提是 s
是一个有效的迭代器(即 string
是有效的,并且 s
是在 string
的有效迭代器范围内。
_s++
将递增 s
,return 生成一个新的 iterator
,它是 [=12= 的 copy ] 在递增之前。
然后 *
取消引用 copied iterator
,产生一个非常量 char&
对 char
的引用 char
s
原来是指内string
.
然后您 return
将调用者的引用原样作为 const char&
引用,这完全没问题。
即使您不想相信这个逻辑,您使用局部变量的方法也很好,您可以 return 通过简单地将该变量声明为引用而不是值来引用,例如:
auto get() -> const char & {
const char &c = *_s;
++_s;
return c;
}