2016-10-05 4 views
5

Я знаю, что это очень простой, возможно даже смущающий вопрос, но у меня возникли проблемы с пониманием этого. Если я std :: перейду от чего-то в стек к другому объекту, может ли другой объект по-прежнему использоваться, когда оригинал выходит из области видимости?std :: перемещение по объекту стека

#include <iostream> 
#include <string> 

int 
main(int argc, char* argv[]) 
{ 
    std::string outer_scope; 

    { 
     std::string inner_scope = "candy"; 
     outer_scope = std::move(inner_scope); 
    } 

    std::cout << outer_scope << std::endl; 

    return 0; 
} 

Является ли outer_scope все еще действительным, когда я пытаюсь его распечатать?

+2

Да, конечно. Вся цель конструктора/назначения перемещения заключается в том, чтобы украсть содержимое из временных рядов - это было бы бесполезно, если бы построенный объект не мог использоваться после того, как временный вопрос оканчивается. –

+0

Если вы что-то двигаете, это значит, что вы переместили его сейчас, и теперь контроль над ним больше не выполняется. – NathanOliver

+0

Конечно, это – MikeMB

ответ

4

Да, он по-прежнему действителен, объект innerscope теряет право собственности на контент, который он ранее имел, а наружный оператор становится владельцем. std :: move - это векторный своп. Если вы меняете внешний и внутренний, разрушающий внутренний элемент не будет влиять на контент, который теперь принадлежит внешнему.