其中一个即将到来的C ++标准,C ++ 0X,凉爽的新功能是“rvalue引用”。一个rvalue参考类似于左值(正常)参考,不同之处在于它可以被绑定到一个临时值(通常,暂时只能被绑定到const参考):

void FunctionWithLValueRef(int& a) {...}
void FunctionWithRValueRef(int&& a) {...}

int main() {
     FunctionWithLValueRef(5); // error, 5 is a temporary
     FunctionWithRValueRef(5); // okay
}

那么,为什么他们发明了一种全新的类型,而不是仅仅取消对正常的引用的限制,允许它们被绑定到临时工?

有帮助吗?

解决方案

这将是没有意义的。你会改变在功能上的事情,因为东西实际上是一个临时的变化将立即消失。

究其原因,新类型的需要茎能够决定什么是真正的右值,什么不是。只有这样你才能在实际使用当中,因为他们使用的很酷的事情。

string toupper(string && s) { // for nonconst rvalues
    for(char &c : s) make_uppercase(c);
    return move(s); // move s into a returned string object
}

string toupper(string const& s) { // for the rest
    // calls the rvalue reference version, by passing 
    // an rvalue copy.
    return toupper(string(s));
}

现在,如果你有一些右值并把它传递给TOUPPER,右值可以直接进行修改,因为我们知道暂时是扔掉的东西,无论如何,所以我们可以藏汉只是改变它,也不需要复制它。此外,相同的观测用于东西叫做布展构造函数和移动赋值。右手侧是不可复制的,但它的事情是被盗走并移动到*this

如果你是说右值可以绑定到非const左值的引用,那么你就没有办法弄清楚,是否引用左值(命名对象),或在最后一个右值(临时)。


这也可能是多一点知道,但无论如何有用的,你可以把左值或右值REF-预选赛上的一个成员函数。下面是一个例子,这自然延伸rvalue引用的现有语义到隐式对象参数:

struct string {
    string& operator=(string const& other) & { /* ... */ }
};

现在,你可以不再说

string() = "hello";

这是令人困惑,而不是真正的决策意识的大部分时间。什么上面的&确实是说,赋值运算符只能在左值调用。同样可以做了右值,通过将&&

其他提示

由于添加新种参考允许编写的方法的两个重载:

void CopyFrom(MyClass &&c)
{
    dataMember.swap(c);
}

void CopyFrom(const MyClass &c)
{
    dataMember.copyTheHardWay(c);
}

这接受新种参考版本被允许修改其接收到的变量,因为该变量是不会在其他地方使用。因此,它可以“偷”的它的内容。

这是加入此功能的全部原因;保持一种类型的参考不会达到预期的目标。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top