2011-01-08 12 views
11

Por favor, ¿podría alguien explicar en inglés sencillo qué significa "extender la semántica de movimiento a * esto"? I am referring to this proposal. Todo lo que estoy buscando es lo que es & por qué lo necesitamos. Tenga en cuenta que entiendo qué es una referencia de valor en general, sobre qué semántica de movimiento se construye. ¡No soy capaz de entender qué tal extensión agrega a las referencias de valor!¿De qué se trata la semántica de movimientos extendidos a * esto?

Respuesta

10

La función de calificación ref (que indica el tipo de *this) le permite distinguir si se puede invocar una función miembro en rvalues ​​o lvalues ​​(o ambos), y sobrecargar funciones basadas en eso. El first version da cierta razón de ser en la parte informal:

Prevenir 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! 
} 

Habilitar la semántica movimiento:

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 
+0

. Buena respuesta. – AraK

7

Por ejemplo, se puede sobrecargar los operadores como funciones libres con referencias rvalue si lo desea:

Foo operator+(Foo&& a, const Foo& b) 
{ 
    a += b; 
    return std::move(a); 
} 

para lograr el mismo efecto con una función miembro, que necesita la propuesta citada:

Foo Foo::operator+(const Foo& b) && // note the double ampersand 
{ 
    *this += b; 
    return *this; 
} 

El doble ampersand dice "esta función de miembro solo puede invocarse en valores r".

Si debe o no mudarse explícitamente desde *this en dicha función miembro se discute here.

+0

Gracias por la respuesta :) Gracias – AraK

Cuestiones relacionadas