[英]Can std::move move a built-in types or c pointer or array
我有3個問題:
std::move
可以移動內置類型嗎?int a = 10;
int b = std::move(a);
a
會是無效值嗎?
std::move
可以移動指針嗎int *a = new int[10];
int *b = std::move(a);
a
會變成無效指針或nullptr
嗎?
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);
a.array
會變成無效數組嗎?
move
本身除了static_cast
什么都不做。 根據cppreference.com
它完全等同於將 static_cast 轉換為右值引用類型。
因此,這取決於您在move
之后分配給的變量的類型,如果該類型具有帶右值參數的constructors
或assign operators
,它可能會或可能不會竊取原始變量的內容,因此,它可能會離開原始變量位於unspecified state
:
除非另有說明,否則所有已移出的標准庫對象都放置在有效但未指定的 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.