2017-05-31 3 views
0

J'étudie maintenant C++ 11 et je suis confus par la catégorie de valeur des expressions en C++ 11. Selon terminology le Lvalue est le point en haut à gauche du W, c'est-à-dire iM (ou im parfois) signifiant "a identité mais ne peut pas être déplacé de ". Cela me rend vraiment confus. Veuillez prendre en compte l'exemple ci-dessous:Que signifient-ils en ayant une identité mais pas mobile pour Lvalue en C++ 11?

#include <iostream> 

int main() 
{ 
    int a = 0, b = 1, c = 2; 
    a = std::move(b = c); 
    std::cout << a << '\n'; 
} 

Cet exemple a bien été compilé.

Nous savons tous que l'affectation b = c est une Lvalue alors que signifient-ils par 'ne peut être déplacé de'? Donnez des exemples qui illustrent clairement ceci!

Merci!

+2

[Pourquoi std move est-il nommé ainsi] (https://stackoverflow.com/questions/21358432/why-is-stdmove-named-stdmove) – Caleth

Répondre

3

En gros:

  • un lvalue a une identité parce que vous pouvez prendre son adresse

    int x; 
    &x; // ok 
    
  • un lvalue ne peut pas être déplacé de car il ne peut pas être utilisé comme argument déplacer constructeur/affectation

    struct Foo 
    { 
        Foo(Foo&); // 0 
        Foo(Foo&&); // 1 
    }; 
    
    Foo x; 
    Foo y{x}; // calls 0, not 1 
    

    Dans l'exemple ci-dessus, x est un lvalue: le constructeur de copie est appelé. Si vous voulez passer de x, vous devez en faire un rvalue: c'est pourquoi vous devez utiliser std::move(x) pour et le convertir en référence rvalue.

    Foo y{std::move(x)}; // calls 1 
    

Dans votre exemple std::move(b = c) est un rvalue, comme std::move est littéralement juste un static_cast à une référence rvalue.

+0

Pouvez-vous donner un exemple qui devrait montrer des erreurs de compilation dues à "ne peut pas être déplacé de "? –