这是使用 C++11 右值引用和移动语义来实现便利包装的正确方法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)};
应该将临时函数a
中的内容移动到.reverse
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”)。如果将它传递给具有移动语义的函数,它将被移动 - 但是由于result
上面的命名返回值优化 (NRVO) 甚至可以就地构造(比移动语义更好)。