我有 3 个问题:
- Can
std::move
移动内置类型?
int a = 10;
int b = std::move(a);
Will a
是无效值吗?
- Can
std::move
移动指针
int *a = new int[10];
int *b = std::move(a);
Will a
成为无效指针或nullptr
?
- can
std::move
移动 C 数组?
struct S {
int array[10];
}
S a;
for(int i=0; i<10; i++)
a.array[i]=1;
S b;
b = std::move(a);
Will a.array
变成无效数组?
move
它本身什么也不做,而是static_cast
。根据cppreference.com https://en.cppreference.com/w/cpp/utility/move
它完全等同于 static_cast 到右值引用类型。
因此,它取决于您在之后分配给的变量的类型move
,如果类型有constructors
or assign operators
需要一个右值参数,它可能也可能不steal原始变量的内容,因此,它可能会将原始变量保留在unspecified state
:
除非另有指定,否则所有已移出的标准库对象都将置于有效但未指定的状态。
回到你的问题,因为没有什么特别的move constructor
or move assign operator
对于内置文字类型(例如整数和原始指针),因此,它将只是这些类型的简单副本。因此,对于问题 1 和问题 2,a
生效后仍然有效且未更改move
。由于C++不允许对C数组直接赋值,因此问题3中的代码无法编译。
- - 编辑 - -
您最初的第三个问题是将一个普通的 C 数组分配给另一个数组,这是该语言不允许的。
您更新的第三个问题有所不同,它在结构中嵌入了一个 C 数组,现在您将一个结构分配给另一个结构,该结构现在可以编译。因为你没有move assign operator
对于您的结构,调用默认的赋值运算符,它执行字节级复制,因此,a
移动和分配后没有变化。
仅当结构的所有成员都是 POD(纯旧数据)时才会发生这种情况。如果将非 POD 成员添加到结构中,则赋值语句将无法编译,因为它无法使用默认的“字节级复制”赋值运算符来复制非 POD 成员(例如,字符串对象)。
struct S {
std::string something; // non-POD member
int array[100];
};
S a, b;
b = std::move(a); // this line will not compile
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)