C ++ 11 std :: reverse()的便捷包装器

时间:2012-04-19 10:52:10

标签: c++ algorithm stl c++11 wrapper

这是使用C ++ 11 rvalue-references并移动语义以实现std::reverse()的便捷包装的正确方法吗?

template <class BIDirContainer> inline BIDirContainer&& reverse(BIDirContainer a) {
    std::reverse(begin(a), end(a));
    return std::move(a); 
}

代码适用于我的测试用例,但我不确定它的性能:我应该在这里使用&&还是不必要?

3 个答案:

答案 0 :(得分:3)

如果你返回(右值)引用,那么你将得到一个悬空引用,因为a是一个本地对象。按价值回报,一切都应该“正常”。

答案 1 :(得分:2)

我想说正确的方法是从函数中返回值:

template <class BIDirContainer> inline BIDirContainer reverse(BIDirContainer a) {
    std::reverse(begin(a), end(a));
    return a; 
}

然后给BIDirContainer一个移动构造函数如果它没有。那么这种表达方式:

BIDirContainer x = ...;
BIDirContainer backwards{reverse(x)};

应将a函数中的临时reverse的内容移至backwards

答案 2 :(得分:0)

所以如果你想修改参数......

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;
}

函数的返回值已经是rvalue(特别是“xvalue”)。如果将它传递给具有移动语义的函数,它将被移动 - 但是由于上面的命名返回值优化(NRVO)result甚至可以就地构造(优于移动语义)。