什么是“rvalue引用*这个”?

什么是“rvalue引用*这个”?

在clang‘s中遇到了一个叫做“rvalue Reference for*this”的建议C+11状态页.

我读了很多关于参考文献的文章,并且理解了它们,但我想我不知道这一点。我也找不到太多的资源在网络上使用这些条款。

页面上有一个指向提案文件的链接:N 2439(将Move语义扩展到*this),但我也没有从其中获得多少示例。

这个特性是关于什么的?


慕尼黑的夜晚无繁华
浏览 679回答 3
3回答

一只名叫tom的猫

对于lvalue ref-限定符表单有一个附加的用例。C+98有允许非-const为rvalue类实例调用的成员函数。这导致了各种各样的怪诞,违背了价值的概念,偏离了内置类型的工作方式:struct S {   S& operator ++();    S* operator &(); };S() = S();      // rvalue as a left-hand-side of assignment!S& foo = ++S(); // oops, dangling reference&S();              // taking address of rvalue...Lvalue ref-限定符解决了以下问题:struct S {   S& operator ++() &;   S* operator &() &;   const S& operator =(const S&) &;};现在,操作符的工作方式类似于内置类型的操作符,只接受lvalue。

偶然的你

假设在类中有两个函数,它们具有相同的名称和签名。但其中一人被宣布const:void&nbsp;SomeFunc()&nbsp;const;void&nbsp;SomeFunc();如果类实例不是const,过载解析将优先选择非Const版本。如果实例是const,则用户只能调用const版本。而this指针是const指针,因此无法更改实例。这个‘的r值引用允许您添加另一个选项:void&nbsp;RValueFunc()&nbsp;&&;这允许您拥有一个可以只如果用户通过适当的r值调用它,则调用.所以如果这是在Object:Object&nbsp;foo;foo.RValueFunc();&nbsp;//error:&nbsp;no&nbsp;`RValueFunc`&nbsp;version&nbsp;exists&nbsp;that&nbsp;takes&nbsp;`this`&nbsp;as&nbsp;l-value.Object().RValueFunc(); &nbsp;//calls&nbsp;the&nbsp;non-const,&nbsp;&&&nbsp;version.这样,您可以根据对象是否通过r值访问来专门化行为。请注意,不允许在r值引用版本和非引用版本之间重载。也就是说,如果您有一个成员函数名,它的所有版本要么使用l-r值限定符,要么在this或者他们都不知道。你不能这么做:void&nbsp;SomeFunc();void&nbsp;SomeFunc()&nbsp;&&;你必须这样做:void&nbsp;SomeFunc()&nbsp;&;void&nbsp;SomeFunc()&nbsp;&&;请注意,此声明更改了*this..这意味着&&所有版本都以r值引用的形式访问成员。因此,可以很容易地从对象内部移动。提案的第一个版本中给出的例子是(注:C+11的最终版本可能不正确;它直接来自这个提案的初始“r-值”):class&nbsp;X&nbsp;{ &nbsp;&nbsp;&nbsp;std::vector<char>&nbsp;data_;public: &nbsp;&nbsp;&nbsp;//&nbsp;... &nbsp;&nbsp;&nbsp;std::vector<char>&nbsp;const&nbsp;&&nbsp;data()&nbsp;const&nbsp;&&nbsp;{&nbsp;return&nbsp;data_;&nbsp;} &nbsp;&nbsp;&nbsp;std::vector<char>&nbsp;&&&nbsp;data()&nbsp;&&&nbsp;{&nbsp;return&nbsp;data_;&nbsp;}};X&nbsp;f();//&nbsp;...X&nbsp;x;std::vector<char>&nbsp;a&nbsp;=&nbsp;x.data(); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;copystd::vector<char>&nbsp;b&nbsp;=&nbsp;f().data();&nbsp;//&nbsp;move
打开App,查看更多内容
随时随地看视频慕课网APP