Che cosa è “L'estensione semantica mossa a * questo” tutto questo?
-
08-10-2019 - |
Domanda
Per favore, qualcuno potrebbe spiegare in parole povere ciò che è "L'estensione semantica mossa a * questo"? mi riferisco a questa proposta . Tutto quello che sto cercando è cosa è che e perché abbiamo bisogno di questo. Si noti che io capisco quello che un riferimento rvalue è, in generale, su cui la semantica Move è costruito. Io non sono in grado di cogliere ciò che tale estensione aggiunge riferimenti rvalue!
Soluzione
La funzione di ref-qualificazione (che indica il tipo di *this
) consentirebbe di distinguere se una funzione membro può essere chiamato su rvalues ??o lvalue (o entrambi), e alle funzioni di sovraccarico basano su questo. Il prima versione dà una certa logica in la parte informale:
Prevenire sorprende:
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! }
Attiva semantica move:
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
Altri suggerimenti
Per esempio, si può sovraccaricare gli operatori come funzioni gratuiti con riferimenti rvalue se lo si desidera:
Foo operator+(Foo&& a, const Foo& b)
{
a += b;
return std::move(a);
}
Per ottenere lo stesso effetto con una funzione membro, è necessario la proposta citata:
Foo Foo::operator+(const Foo& b) && // note the double ampersand
{
*this += b;
return *this;
}
Il doppio ampersand dice "questo funzione membro può essere chiamato solo su rvalues".
O se non si deve esplicitamente passare da *this
in tale funzione membro viene discusso qui .