为什么的C ++ 0x右值引用不是默认?
题
其中一个即将到来的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);
}
这接受新种参考版本被允许修改其接收到的变量,因为该变量是不会在其他地方使用。因此,它可以“偷”的它的内容。
这是加入此功能的全部原因;保持一种类型的参考不会达到预期的目标。
不隶属于 StackOverflow