1

这是使用 C++11 右值引用和移动语义来实现便利包装的正确方法std::reverse()吗?

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

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

4

3 回答 3

3

如果您通过(右值)引用返回,那么您将获得一个悬空引用,因为a它是一个本地对象。按值返回,一切都应该“正常工作”。

于 2012-04-19T12:17:06.107 回答
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中的内容移动到.reversebackwards

于 2012-04-19T12:21:30.243 回答
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;
}

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

于 2012-04-19T12:31:02.650 回答