这是使用C ++ 11 rvalue-references并移动语义以实现std::reverse()
的便捷包装的正确方法吗?
template <class BIDirContainer> inline BIDirContainer&& reverse(BIDirContainer a) {
std::reverse(begin(a), end(a));
return std::move(a);
}
代码适用于我的测试用例,但我不确定它的性能:我应该在这里使用&&
还是不必要?
答案 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
甚至可以就地构造(优于移动语义)。