我有 3 个问题:
std::move移动内置类型吗?int a = 10;
int b = std::move(a);
Run Code Online (Sandbox Code Playgroud)
会a是无效值吗?
std::move移动指针int *a = new int[10];
int *b = std::move(a);
Run Code Online (Sandbox Code Playgroud)
会a变成无效指针还是nullptr?
std::move移动ac阵列吗?struct S {
int array[10];
}
S a;
for(int i=0; i<10; i++)
a.array[i]=1;
S b;
b = std::move(a);
Run Code Online (Sandbox Code Playgroud)
会a.array变成无效数组吗?
move它本身不执行任何操作,而是执行static_cast. 根据cppreference.com
它完全等同于 static_cast 到右值引用类型。
因此,这取决于您在 后分配给的变量的类型move,如果该类型具有constructors或assign operators带有右值参数,它可能会也可能不会窃取原始变量的内容,因此,它可能会将原始变量保留为在unspecified state:
除非另有指定,否则所有已移出的标准库对象都将置于有效但未指定的状态。
回到你的问题,因为没有特殊的move constructor或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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1240 次 |
| 最近记录: |