这里有几个问题。
一个是您正在使用int
. 而对于int
副本来说,速度与移动一样快。因此,将移动作为副本实施是完全合理的。
不要求移动构造(或赋值)改变被移动事物的值。在您的代码中继续将其视为具有有用值是一个逻辑错误,但并不要求该值变得无用。
第二个是您编写的代码实际上并没有移动任何东西。简单地使用::std::move
不会导致某些东西被移动。这只是将左值转换为右值以便移动某些东西的好方法。在你的情况下,var
有一个名字,所以它是一个左值。var2
您对in的初始化func
实际上是一个副本,而不是移动。如果您已经编写了它int var2(move(var));
,那么它将是一个移动,并且var1
在那时main
可能会失效。
重申一下,该::std::move
函数只是向阅读您的代码的人发出信号,表明可能会发生移动,并且之后的变量值无法计算。它实际上并没有移动任何东西。
这是您的代码的标记版本:
// func requires a temporary argument, something that can be moved from
void func(int&& var)
{
int var2(var); // Doesn't actually call int(int &&), calls int(int &)
// int var2(move(var)); // Would actually call int(int &&) and a move would
// happen then at this point and potentially alter the
// value of what var is referencing (which is var1
// in this code).
}
void main()
{
int var1 = 22;
func(move(var1)); // Tell people that var1's value may be unspecified after
// Also, turn var1 into a temporary to satisfy func's
// signature.
}
由于您编写的代码不会导致发生任何移动,因此这里有一个版本肯定会在某处移动某些东西:
#include <vector>
#include <utility>
using ::std;
// Still require an rvalue (aka a temporary) argument.
void func(vector<int>&& var)
{
// But, of course, inside the function var has a name, and is thus an lvalue.
// So use ::std::move again to turn it into an rvalue.
vector<int> var2(move(var));
// Poof, now whetever var was referencing no longer has the value it used to.
// Whatever value it had has been moved into var2.
}
int main()
{
vector<int> var1 = { 32, 23, 66, 12 };
func(move(var1)); // After this call, var1's value may no longer be useful.
// And, in fact, with this code, it will likely end up being an empty
// vector<int>.
}
而且,当然,这种写法很愚蠢。有时有理由指定参数是临时的。这通常是如果您有一个版本的函数采用引用,而另一个版本采用右值引用。但一般你不会那样做。因此,这是编写此代码的惯用方式:
#include <vector>
#include <utility>
using ::std;
// You just want a local variable that you can mess with without altering the
// value in the caller. If the caller wants to move, that should be the caller's
// choice, not yours.
void func(vector<int> var)
{
// You could create var2 here and move var into it, but since var is a
// local variable already, why bother?
}
int main()
{
vector<int> var1 = { 32, 23, 66, 12 };
func(move(var1)); // The move now does actually happen right here when
// constructing the argument to func and var1's value
// will change.
}
当然,var1
在该代码中命名有点愚蠢。真的,它应该这样写:
func(vector<int>{ {32, 23, 66, 12} });
然后你只是在那里构建一个临时向量并将其传递给func
. 没有明确使用move
required。