int a、解引用 *p、函數返回引用。10、函數返回值 getName()、std::move(x) 結果。T&&僅能綁定右值,延長臨時對象生命周期。配合 std::move 將左值轉為右值引用,啟用移動語義。
class ArrayWrapper {
int* data; size_t size;
public:
ArrayWrapper(size_t n) : data(new int[n]), size(n) {}
// 移動構造
ArrayWrapper(ArrayWrapper&& other) noexcept
: data(other.data), size(other.size) {
other.data = nullptr; other.size = 0; // 關鍵:置空源對象
}
// 移動賦值
ArrayWrapper& operator=(ArrayWrapper&& other) noexcept {
if (this != &other) {
delete[] data;
data = other.data; size = other.size;
other.data = nullptr; other.size = 0;
}
return *this;
}
~ArrayWrapper() { delete[] data; }
};
std::move 實現原理本質是 static_cast,利用引用折疊規則:
templatetypename remove_reference ::type&& move(T&& t) noexcept { return static_cast ::type&&>(t); }
T 推導為 T& → T& && 折疊為 T& → 返回 T&&。T 推導為 T → T&& → 返回 T&&。移動構造中,成員若為類類型,**需顯式 std::move** 才會調用其移動構造,否則調用拷貝構造。