我正在研究从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能按预期工作?因为它在上面似乎不太安全。
答案 0 :(得分:4)
std::vector<int>&& get_data() && {
return std::move(data);
}
这应该返回一个std::vector<int>
,然后没有问题。