我正在调查从rvalue引用限定符函数返回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()返回对临时的引用,该引用在完整语句后被销毁。
也许对于这样的for循环,这可以以某种方式修复?或者我们应该按值返回,并希望RVO能像预期的那样工作?因为在我看来,这不是很安全。
发布于 2017-01-19 20:03:16
std::vector<int>&& get_data() && {
return std::move(data);
}
这应该返回一个std::vector<int>
,这样就没有问题了。
https://stackoverflow.com/questions/41740676
复制相似问题