在特定情况下,你们能否给我提供一个具有说明性的例子,以证明以下陈述的有用性和必要性?
AnyTypeMovable v;
AnyTypeMovable&& r = move(v);
在特定情况下,你们能否给我提供一个具有说明性的例子,以证明以下陈述的有用性和必要性?
AnyTypeMovable v;
AnyTypeMovable&& r = move(v);
不,AnyTypeMovable&& r = move(v);
在这里完全没有用。
考虑以下代码:
#include <iostream>
#include <vector>
class MyMovableType
{
int i;
public:
MyMovableType(int val): i(val){}
MyMovableType(MyMovableType&& r) { this->i = r.i; r.i = -1; }
MyMovableType(const MyMovableType& r){ this->i = r.i; }
int getVal(){ return i; }
};
int main()
{
std::vector<MyMovableType> vec;
MyMovableType a(10);
MyMovableType&& aa = std::move(a);
vec.push_back(aa);
std::cout << a.getVal() << std::endl;
return 0;
}
正如R. Martinho Fernandes和Xeo指出的那样(命名的右值引用是左值),由于aa
是一个左值,因此这将打印出10
,表明移动操作尚未执行(无论是在赋值还是在push_back
调用中),因此您仍需要将其std::move
到push_back
方法中,就像这个例子:
#include <iostream>
#include <vector>
class MyMovableType
{
int i;
public:
MyMovableType(int val): i(val){}
MyMovableType(MyMovableType&& r) { this->i = r.i; r.i = -1; }
MyMovableType(const MyMovableType& r){ this->i = r.i; }
int getVal(){ return i; }
};
int main()
{
std::vector<MyMovableType> vec;
MyMovableType a(10);
MyMovableType&& aa = std::move(a);
vec.push_back(std::move(aa));
std::cout << a.getVal() << std::endl;
return 0;
}
将执行移动操作,因此输出将为-1
。因此,尽管您正在通过push_back
传递aa
,但仍然需要通过std::move
传递它。
std::string&&
就相当于 std::string&
吗?这是标准如何定义的? - Haatschiistd::string
并不要求原始字符串保持在特定的状态。它只需要是有效的,而且它的原始值保持不变也完全没有问题。 - R. Martinho Fernandes#include <iostream>
#include <vector>
class MyMovableType
{
int i;
public:
MyMovableType(int val) noexcept : i(val){}
MyMovableType(MyMovableType&& r) noexcept { this->i = r.i; r.i = -1; }
MyMovableType(const MyMovableType& r) noexcept{ this->i = r.i; }
int getVal()const noexcept{ return i; }
};
int main()
{
std::vector<MyMovableType> vec;
MyMovableType a(10);
MyMovableType&& aa = std::move(a);
vec.push_back( std::forward<decltype(a)>(aa) );
std::cout << a.getVal() << std::endl; // -1 printed.
return 0;
}
r
现在是一个左值(它有一个名称!),而且你需要使用std::move(r)
来使它成为右值。 - R. Martinho Fernandesv
不需要是可移动的。 - Xeostd::move
。 - aaronman