繁体   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