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