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