rvalue引用限定符是否应返回rvalue引用?

时间:2017-01-19 11:28:41

标签: c++ c++11 c++14

我正在研究从rvalue ref-qualifier函数返回rvalue引用是否真的好主意。让我们说:

class DataPack {
 public:
  std::vector<int> data;

  DataPack(std::initializer_list<int> d) : data{d} {}

  std::vector<int>& get_data() & {
    return data;
  }
  std::vector<int>&& get_data() && {
    return std::move(data);
  }
  // This version fixes for-loop problem (see below)
  //std::vector<int> get_data() && {
  //  return data;
  //}
};

然后,如果我想在不临时的情况下获取数据,我可以使用以下内容:

auto my_data = DataPack{1,2,3}.get_data();

但是假设我想使用以下代码:

for (auto v : DataPack{1,2,3}.get_data()) {
  std::cout << v << ", ";
}

现在这是UB,因为get_data()返回对完整语句后销毁的临时引用。

也许这可以以某种方式修复这样的 - 循环?或者我们应该按价值回归并希望RVO能按预期工作?因为它在上面似乎不太安全。

1 个答案:

答案 0 :(得分:4)

std::vector<int>&& get_data() && {
   return std::move(data);
}

这应该返回一个std::vector<int>,然后没有问题。