簡體   English   中英

std::move 可以移動內置類型或 c 指針或數組

[英]Can std::move move a built-in types or c pointer or array

我有3個問題:

  1. std::move可以移動內置類型嗎?
int a = 10;
int b = std::move(a);

a會是無效值嗎?


  1. std::move可以移動指針嗎
int *a = new int[10];
int *b = std::move(a);

a會變成無效指針或nullptr嗎?


  1. 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之后分配給的變量的類型,如果該類型具有帶右值參數的constructorsassign operators ,它可能會或可能不會竊取原始變量的內容,因此,它可能會離開原始變量位於unspecified state

除非另有說明,否則所有已移出的標准庫對象都放置在有效但未指定的 state 中。

回到您的問題,因為對於整數和原始指針等內置文字類型沒有特殊的move constructormove 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM