小编Don*_*bro的帖子

避免悬挂参考用于基于反向范围的for循环实现

背景和以前的搜索

我正在寻找一种优雅的方法来在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)

c++ for-loop rvalue-reference c++14

14
推荐指数
1
解决办法
526
查看次数

标签 统计

c++ ×1

c++14 ×1

for-loop ×1

rvalue-reference ×1