首先:std::move
和std::forward
定义在哪里?我知道他们做了什么,但是我找不到任何需要包含标准标题的证据。在gcc44中有时可以使用std::move
,有时它不是,所以一个明确的include指令会很有用。右值引用的一些说明
当实现移动语义时,源可能处于未定义状态。这个状态是否应该是该对象的有效状态?显然,你需要能够调用对象的析构函数,并且能够通过该类所公开的任何方式来分配它。但是其他操作应该有效吗?我想我要问的是,如果你的课程保证了某些不变量,当用户说他们不再关心它们时,你是否应该努力执行这些不变量?
下一页:当您不关心移动语义时,在处理函数参数时是否有任何限制会导致非常量引用优于右值引用? void function(T&);
over void function(T&&);
从调用者的角度来看,能够传递函数临时值有时是有用的,所以看起来好像应该在可行的时候授予该选项。右值引用本身就是左值,所以你不能无意中调用移动构造函数而不是复制构造函数或类似的东西。我没有看到一个缺点,但我确信有一个。
这使我想到我的最后一个问题。您仍然无法将临时对象绑定到非常量引用。但是你可以将它们绑定到非常量右值引用。然后,您可以将该引用作为另一个函数中的非const引用传递。
void function1(int& r) { r++; }
void function2(int&& r) { function1(r); }
int main() {
function1(5); //bad
function2(5); //good
}
除了它没有做任何事情,这个代码有什么问题吗?我的直觉当然不是,因为改变右值引用对他们的存在来说是完整的。如果传递的值是合法的const,编译器会抓住它并向你大喊。但从各方面来看,这都是由于某种原因推测出来的一种机制的过渡,所以我只想确认我没有做任何愚蠢的事情。
谢谢你的详细回复。我认为我理解的东西比以前少了,但是没有错。根据那篇文章,像void f(int &&);''这样的函数不能接受左值,除非它们被明确地转换了吗?这绝对不是我见过的行为,所以我认为这是gcc-4.4的一个缺点我已经做了所有的测试,以了解所有的交互方式如何都毫无价值: -/ – 2010-04-05 18:03:03
@Dennis,是在前一段时间在工作草案中改变的:'int &&'不隐式绑定到 – 2010-04-05 19:10:04
'这篇文章'链接已经死了,你可以把它改为当前版本吗? – 2013-07-08 12:56:02