Also ich glaube du versuchst dir das Ganze etwas zu kompliziert zu denken. Die Move-Semantik macht eigentlich nichts anderes als zu Bewegen anstatt zu kopieren. Dafür gibt es ja auch die neuen Move-Konstruktoren usw.
Und genauso kannst du dir das auch vorstellen. Du nimmst etwas aus dem einen unique_ptr raus und tust es in den anderen rein. Aber genau das möchtest du ja erst bei push machen. D.h. dein Move muss erst dort stattfinden.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
#include <stack>
auto Test( std::unique_ptr<int>& up )
-> void
{
std::stack<std::unique_ptr<int>> stack;
stack.push( std::move( up ) );
}
|
Wenn du sie nicht schon kennst, eventuell hilft dir die Seite:
C++11 und die Sache mit der Move-Semantik
Was ich jetzt nicht nachgeschlagen habe ist, was VC100 alles unterstützt.
Anmerkung:
Ein rvalue ist alles was kein lvalue ist
… Also alles was dir einen Fehler an den Kopf knallt wenn es links steht. Dein bar jedoch kann links stehen, deswegen ist es kein rvalue (zumindest im Block). std::move kann man sich in dem Fall etwas wie einen Cast von lvalue zum rvalue vorstellen so, das move anstatt copy Semantik verwendet wird.