[英]C++11 Convenience wrapper for std::reverse()
這是使用C ++ 11 rvalue-references和移動語義來為std::reverse()
實現便捷包裝的正確方法嗎?
template <class BIDirContainer> inline BIDirContainer&& reverse(BIDirContainer a) {
std::reverse(begin(a), end(a));
return std::move(a);
}
該代碼可以在我的測試用例中工作,但是我不確定它的性能:我應該在這里使用&&
還是不必要的?
如果按(右值)引用返回,則將獲得一個懸空引用,因為a
是本地對象。 價值回報,一切都應該“正常”。
我會說正確的方法是從函數中按值返回:
template <class BIDirContainer> inline BIDirContainer reverse(BIDirContainer a) {
std::reverse(begin(a), end(a));
return a;
}
然后為BIDirContainer
一個移動構造函數(如果沒有)。 然后這種表達:
BIDirContainer x = ...;
BIDirContainer backwards{reverse(x)};
應該將reverse
函數中臨時a
的內容backwards
。
因此,如果您想修改參數...
template <class BIDirContainer>
inline BIDirContainer& reverse(BIDirContainer& a)
{
std::reverse(begin(a), end(a));
return a;
}
如果要制作反向副本,則:
template <class BIDirContainer>
inline BIDirContainer reverse(BIDirContainer a)
{
std::reverse(begin(a), end(a));
return a;
}
函數的返回值已經是一個右值(特別是“ xvalue”)。 如果將其傳遞給具有移動語義的函數,則它將被移動-但是由於命名返回值優化(NRVO),上述result
甚至可以就地構造(比移動語義更好)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.