C++ 右值引用限定符是否应返回右值引用?
我正在调查从右值引用限定符函数返回右值引用是否真的是个好主意。假设我们有:C++ 右值引用限定符是否应返回右值引用?,c++,c++11,c++14,C++,C++11,C++14,我正在调查从右值引用限定符函数返回右值引用是否真的是个好主意。假设我们有: 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>
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;
//}
};
但假设我想使用以下代码:
for (auto v : DataPack{1,2,3}.get_data()) {
std::cout << v << ", ";
}
for(auto v:DataPack{1,2,3}.get_data()){
std::coutstd::vector&&get_data()&&{
返回std::移动(数据);
}
这应该返回一个std::vector
,那么就没有问题了。为什么还有get_data()
首先?仅使用数据就足够了。但是,是的,您希望按值返回。我看不到UB。有人能举出这是UB的原因吗?数据包
实际上没有移出。@FrançoisAndrieux:for
的内部用自动&
捕获范围表达式,因此它变成了auto&&uu expr=DataPack{1,2,3}.get_data()问题是,在表达式结束时, DATAPACK <代码>被破坏,所以代码> Scot Meyers .ExpR//C>成为一个悬空的参考。“ILDJARN,对,现在看起来很明显。谢谢你的澄清。@ T.C.我正在阅读来自12的有效的现代C++,并且有一个类似于上面的例子。我正在尝试T。找到如何在我的代码中使用ref限定符,实际上我现在看不到很多用法。即使在gcc6.3 includes中,我也只能在可选标题中看到ref限定符的用法,它们都返回constexpr rvalue引用。
for (auto v : DataPack{1,2,3}.get_data()) {
std::cout << v << ", ";
}
std::vector<int>&& get_data() && {
return std::move(data);
}