第一:在哪里std::move
定义std::forward
?我知道他们做了什么,但我找不到任何标准标题都需要包含它们的证据。在 gcc44 中有时std::move
可用,有时不可用,因此明确的包含指令会很有用。
在实现移动语义时,源可能处于未定义状态。该状态是否必须是对象的有效状态?显然,您需要能够调用对象的析构函数,并且能够通过类公开的任何方式分配给它。但是其他操作应该有效吗?我想我要问的是,如果你的类保证某些不变量,当用户说他们不再关心它们时,你是否应该努力强制执行这些不变量?
下一步:当您不关心移动语义时,在处理函数参数时,是否有任何限制会导致非常量引用优于右值引用? void function(T&);
从void function(T&&);
调用者的角度来看,能够传递函数临时值有时很有用,因此似乎只要可行,就应该授予该选项。并且右值引用本身就是左值,因此您不能无意中调用移动构造函数而不是复制构造函数或类似的东西。我看不出有什么缺点,但我敢肯定有一个缺点。
这让我想到了我的最后一个问题。您仍然不能将临时对象绑定到非常量引用。但是您可以将它们绑定到非常量右值引用。然后,您可以将该引用作为非常量引用传递给另一个函数。
void function1(int& r) { r++; }
void function2(int&& r) { function1(r); }
int main() {
function1(5); //bad
function2(5); //good
}
除了它什么都不做之外,该代码有什么问题吗?我的直觉说当然不是,因为更改右值引用是它们存在的全部意义。如果传递的值是合法的 const,编译器会捕捉到它并对你大喊大叫。但从表面上看,这是一种机制的变通,可能是出于某种原因而实施的,所以我只想确认我没有做任何愚蠢的事情。