背景和以前的搜索
我正在寻找一种优雅的方法来在C++ 14中使用基于范围的for循环对容器(例如std :: vector)进行反向迭代.寻找一个解决方案,我发现这个Q/A.它基本上告诉我,这不是标准库的一部分,我必须自己使用boost或实现一个适配器.我不想使用boost,所以我现在正在寻找最好的实现.
除了前面提到的Q/A中提出的建议外,我还发现了这个实现以及关于这个主题的博客.大多数实现非常相似,看起来相当不错.然而,它们都有一个陷阱:正如在这个注释中所指出的,如果你用一个临时对象调用反向适配器,你可能会得到一个悬空引用:
for (const auto& v : reverse_iterate(getContainer()))
Run Code Online (Sandbox Code Playgroud)
关于基于范围的for循环中的临时对象的问题,这个答案确实帮助了我的理解.但是,我们可以做些什么来防止悬空参考呢?
我的解决方案
基于这个背景,我正在寻找一种能够摆脱这种陷阱的实现.在下面的实现中,我使用额外的rvalue-reference rx_来延长输入参数的生命周期iff reverse_iterate是用rvalue引用调用的.
编辑:不要使用此解决方案.如公认的解决方案所指出的那样是错误的.
template <typename T>
class reverse_range
{
T &&rx_; // rvalue-reference to prolong livetime of temporary object
T &x_; // reference to container
public:
explicit reverse_range(T &x) : rx_(T{}), x_(x) {}
explicit reverse_range(T &&rx) : rx_(std::move(rx)), x_(rx_) {}
auto begin() const -> decltype(this->x_.rbegin())
{
return x_.rbegin();
}
auto end() …Run Code Online (Sandbox Code Playgroud)