簡體   English   中英

用於std :: reverse()的C ++ 11便利包裝

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM