为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
慕尼黑的夜晚无繁华 2019-06-15 11:26:20
什么是“rvalue引用*这个”?在clang‘s中遇到了一个叫做“rvalue Reference for*this”的建议C+11状态页.我读了很多关于参考文献的文章,并且理解了它们,但我想我不知道这一点。我也找不到太多的资源在网络上使用这些条款。页面上有一个指向提案文件的链接:N 2439(将Move语义扩展到*this),但我也没有从其中获得多少示例。这个特性是关于什么的?
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

对于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。


查看完整回答
反对 回复 2019-06-15
?
偶然的你

TA贡献1841条经验 获得超3个赞

假设在类中有两个函数,它们具有相同的名称和签名。但其中一人被宣布const:

void SomeFunc() const;void SomeFunc();

如果类实例不是const,过载解析将优先选择非Const版本。如果实例是const,则用户只能调用const版本。而this指针是const指针,因此无法更改实例。

这个‘的r值引用允许您添加另一个选项:

void RValueFunc() &&;

这允许您拥有一个可以如果用户通过适当的r值调用它,则调用.所以如果这是在Object:

Object foo;foo.RValueFunc(); //error: no `RValueFunc` version exists that takes `this` as l-value.Object().RValueFunc();
 //calls the non-const, && version.

这样,您可以根据对象是否通过r值访问来专门化行为。

请注意,不允许在r值引用版本和非引用版本之间重载。也就是说,如果您有一个成员函数名,它的所有版本要么使用l-r值限定符,要么在this或者他们都不知道。你不能这么做:

void SomeFunc();void SomeFunc() &&;

你必须这样做:

void SomeFunc() &;void SomeFunc() &&;

请注意,此声明更改了*this..这意味着&&所有版本都以r值引用的形式访问成员。因此,可以很容易地从对象内部移动。提案的第一个版本中给出的例子是(注:C+11的最终版本可能不正确;它直接来自这个提案的初始“r-值”):

class X {
   std::vector<char> data_;public:
   // ...
   std::vector<char> const & data() const & { return data_; }
   std::vector<char> && data() && { return data_; }};X f();// ...X x;std::vector<char> a = x.data();
    // copystd::vector<char> b = f().data(); // move


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 678 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信