概念和實踐中,返回潛在取r值引用的函數的修改值的正確方法是什麼。函數中修正潛在的r值參考的正確返回值是多少?
template<class Vector>
??? add_element(Vector&& v){
v.emplace_back(1.);
return ???(v);
}
直覺告訴我這個,(因爲我做原始類型的不鬆動信息)
template<class Vector>
Vector&& add_element(Vector&& v){
v.emplace_back(1.);
return std::forward<Vector>(v);
}
但其他可能性之中是
template<class Vector>
Vector& add_element(Vector&& v){
v.emplace_back(1.);
return v;
}
甚至這些的,(基於此https://pizer.wordpress.com/2009/04/13/c0x-do-people-understand-rvalue-references/)
template<class Vector>
Vector // or typename std::decay<Vector>::type
add_element(Vector&& v){
v.emplace_back(1.);
return v; // or std::forward<Vector>(v);
}
什麼是最通用的方式來返回修改後的傳遞參數?
如果我理解正確,即使參數不是容器,第一個選項就是這樣一種情況,它給出了必須不妥協的性能和一般性。沒有? – alfC
@alfC如果移動物體昂貴,顯然它不是不妥協的表現。所有長度可變的'std'容器都很便宜,因此在這裏不適用。 – Yakk
也是「永遠不會通過右值引用返回容器」:作爲反例,'std :: optional :: operator *()'或'std :: optional :: value()'_do_通過右值引用返回。 –