什么是“将移动语义扩展到*这个”?

时间:2011-01-08 10:34:46

标签: c++ c++11 this rvalue move-semantics

拜托,有人可以用简单的英语解释什么是“将移动语义扩展到*这个”? I am referring to this proposal。所有我想要的是 是什么& 为什么我们需要它。请注意,我确实理解rvalue引用通常是什么,构建了移动语义。我无法理解这样的扩展为rvalue引用添加了什么!

2 个答案:

答案 0 :(得分:10)

ref-qualifier特性(指示*this的类型)将允许您区分是否可以在rvalues或lvalues(或两者)上调用成员函数,以及基于此重载函数。 first version给出了非正式部分的一些基本原理:

  

防止意外:

struct S {
  S* operator &() &;            // Selected for lvalues only
  S& operator=(S const&) &;     // Selected for lvalues only
};

int main() {
  S* p = &S();                  // Error!
  S() = S();                    // Error!
}
     

启用移动语义:

class X {
   std::vector<char> data_;
public:
   // ...
   std::vector<char> const & data() const & { return data_; }
   std::vector<char> && data() && { return data_; } //should probably be std::move(data_)
};

X f();

// ...
X x;
std::vector<char> a = x.data(); // copy
std::vector<char> b = f().data(); // move

答案 1 :(得分:7)

例如,如果您愿意,可以将运算符重载为具有右值引用的自由函数:

Foo operator+(Foo&& a, const Foo& b)
{
    a += b;
    return std::move(a);
}

要使用成员函数获得相同的效果,您需要引用的提案:

Foo Foo::operator+(const Foo& b) &&   // note the double ampersand
{
    *this += b;
    return *this;
}

双&符号说“这个成员函数只能在rvalues上调用”。

是否必须明确地从*this这样的成员函数中移出here