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!

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top