Подтвердить что ты не робот

Что такое "Расширение семантики перемещения до * этого"?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Например, вы можете перегрузить операторы как свободные функции с помощью ссылок 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;
}

Двойной амперсанд говорит: "эту функцию-член можно вызывать только на rvalues".

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