Khi thực hiện nhà xây dựng di chuyển và toán tử gán di chuyển, người ta thường viết mã như thế này:Tại sao di chuyển một biến con trỏ không đặt nó thành null?
p = other.p;
other.p = 0;
Các hoạt động di chuyển ngầm định sẽ được thực hiện với mã như thế này:
p = std::move(other.p);
nào sẽ là sai lầm, vì việc di chuyển một biến con trỏ không không phải là đặt biến đó thành rỗng. Tại sao vậy? Có trường hợp nào chúng tôi muốn các hoạt động di chuyển rời khỏi biến con trỏ ban đầu không thay đổi?
Lưu ý: Bằng cách "di chuyển", tôi làm không chỉ có nghĩa là biểu thức con std::move(other.p)
, ý tôi là toàn bộ biểu thức p = std::move(other.p)
. Vì vậy, tại sao không có quy tắc ngôn ngữ đặc biệt nào nói rằng "Nếu phía bên tay phải của một nhiệm vụ là con trỏ xvalue, nó được đặt thành null sau khi việc gán đã diễn ra."?
Tại sao phải có? Điều duy nhất bạn phải làm với một đối tượng 'di chuyển' là bỏ qua nó. Có một con trỏ trỏ đến bộ nhớ không thuộc sở hữu của lớp không phải là một vấn đề nếu bạn không còn sử dụng con trỏ, phải không? – hvd
"Bạn không trả tiền cho những gì bạn không sử dụng"? –
@hvd: The destructor chắc chắn sẽ không bỏ qua nó nếu nó nói 'delete p' :) – fredoverflow