Что такое «Расширение семантики перемещения до * this»? - PullRequest
11 голосов
/ 08 января 2011

Пожалуйста, кто-нибудь может объяснить простым языком, что такое "Расширение семантики перемещения до * this"? Я имею в виду это предложение . Все, что я ищу, это , что это то, что & зачем нам это нужно. Обратите внимание, что я понимаю, что такое ссылка на rvalue в целом, на которой построена семантика перемещения. Я не могу понять, что такое расширение добавляет к ссылкам rvalue!

Ответы [ 2 ]

10 голосов
/ 08 января 2011

Функция ref-qualifier (указывающая тип *this) позволит вам различать, может ли функция-член вызываться по rvalues ​​или lvalue (или обоим), и перегружать функции на основе этого. первая версия дает некоторое объяснение в неформальной части:

Предотвращение сюрпризов:

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
7 голосов
/ 08 января 2011

Например, вы можете перегрузить операторы как свободные функции ссылками на rvalue, если хотите:

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;
}

Двойной амперсанд говорит, что «эта функция-член может быть вызвана только для значений r».

Вопрос о том, нужно ли вам явно перейти от *this в такой функции-члене, обсуждается здесь .

...