Giả sử tôi có hai véc tơ và tôi di chuyển một véc tơ cho nhau, v1 = std::move(v2)
; v2
vẫn ở trạng thái có thể sử dụng sau này?Việc di chuyển có rời khỏi đối tượng trong trạng thái có thể sử dụng không?
Trả lời
Từ n3290, 17.6.5.15 Moved-từ trạng thái của các loại thư viện [lib.types.movedfrom]
- Đối tượng của các loại quy định tại Thư viện C++ chuẩn có thể được di chuyển từ (12,8) . Các thao tác di chuyển có thể được chỉ định rõ ràng hoặc được tạo ngầm. Trừ khi có quy định khác, các đối tượng chuyển từ đó phải được đặt ở trạng thái hợp lệ nhưng không xác định.
Kể từ khi nhà nước có giá trị, điều này có nghĩa bạn có thể an toàn hoạt động trên v2
(ví dụ bằng cách gán cho nó, mà sẽ đưa nó trở lại trạng thái nổi tiếng). Vì nó là không xác định, tuy nhiên, nó có nghĩa là bạn không thể ví dụ dựa trên bất kỳ giá trị cụ thể cho v2.empty()
miễn là nó đang ở trong trạng thái này (nhưng gọi nó sẽ không sụp đổ chương trình). Lưu ý rằng tiên đề này của ngữ nghĩa di chuyển ("Di chuyển từ các đối tượng được để ở trạng thái hợp lệ nhưng không xác định") là một thứ mà tất cả mã nên cố gắng hướng tới (phần lớn thời gian), không chỉ các thành phần của Thư viện Chuẩn. Giống như ngữ nghĩa của các nhà xây dựng sao chép nên là tạo bản sao nhưng không được thực thi.
+1, nhưng cách nó được viết, có vẻ như bạn không biết liệu 'v2' có rỗng sau' v2 = std :: vector {}; ' – Gabriel
@Gabriel Tốt hay không, chỉnh sửa là theo thứ tự. –
Không, nó được để ở trạng thái không xác định.
Trích từ open-std-org bài viết -
.. move() cho mục tiêu giá trị của đối số của nó, nhưng là không bắt buộc phải duy trì giá trị của nguồn. Vì vậy, đối với một vectơ, di chuyển() có thể được dự kiến sẽ để lại đối số của nó như là một vector có công suất bằng 0 để tránh phải sao chép tất cả các phần tử. Nói cách khác, di chuyển là một cách đọc có khả năng phá hoại.
Nó nằm trong trạng thái không hợp lệ _but valid_. Tức là, bạn vẫn có thể sử dụng đối tượng theo cách chỉ có điều kiện tiên quyết mà đối tượng là hợp lệ. Ví dụ, bạn có thể gọi vector :: clear() trên đó chuyển từ vector để làm cho nó vào một trạng thái đã biết, và sau đó bắt đầu chèn các đối tượng vào nó. – bames53
Nó __must__ hợp lệ. Nếu không thì điều gì sẽ xảy ra khi đối tượng vượt quá phạm vi.Nhiều khả năng nó sẽ không có bất cứ thứ gì trong kho dữ liệu của nó, nhưng bất kể nó là gì, nó sẽ hợp lệ. – Damon
Có nhiều mức độ hợp lệ (trừu tượng). Theo như ngôn ngữ có liên quan, đối tượng sau khi di chuyển là hợp lệ khi đối tượng vẫn tồn tại, hàm hủy của nó có thể được gọi mà không gây ra hành vi không xác định, vv. . Ví dụ, thực tế là một vector đã trở thành zero-sized (không có dung lượng) là một vector C++ hợp lệ, nhưng một đối tượng có một phương thức đặt một phần tử cụ thể trên vectơ, mà không xác minh giả định (hiện đã bị vô hiệu hóa) vector phải có kích thước cụ thể, trở thành ... – rwong
Nếu bạn muốn sử dụng v2 sau khi di chuyển, bạn sẽ muốn làm điều gì đó như:
v1 = std::move(v2);
v2.clear();
Tại thời điểm này, v1 sẽ có các nội dung ban đầu của v2 và v2 sẽ được trong một cái giếng trạng thái trống đã xác định. Điều này làm việc trên tất cả các container STL (và các chuỗi, cho rằng vấn đề), và nếu bạn đang thực hiện các lớp học của riêng bạn có hỗ trợ di chuyển ngữ nghĩa, có thể bạn sẽ muốn làm một cái gì đó tương tự.
Nếu việc triển khai STL thực sự cụ thể của bạn KHÔNG để đối tượng ở trạng thái trống, thì lệnh clear() thứ hai về cơ bản sẽ là một no-op. Trong thực tế, nếu đây là trường hợp, nó sẽ là một tối ưu hóa pháp lý cho một trình biên dịch để loại bỏ rõ ràng() sau khi di chuyển.
- 1. Lấy trạng thái đối tượng
- 2. đối tượng có trạng thái và hành vi trong oop
- 3. Việc sử dụng máy chủ web có trạng thái có ý nghĩa không?
- 4. Có phải HashAlgorithm.ComputeHash() có trạng thái không?
- 5. HTTPS có trạng thái hoặc trạng thái không?
- 6. Serialization của các đối tượng: không có trạng thái thread có thể được tham gia, phải không?
- 7. không thể sửa lỗi đối tượng lỗi HEAD có trạng thái git
- 8. Tìm tất cả việc sử dụng trạng thái phiên
- 9. Tôi có thể di chuyển đối tượng Flash trong DOM mà không cần tải lại không?
- 10. Trạng thái hoạt động của nút css có khiến văn bản di chuyển không?
- 11. Bạn có thể tạo trạng thái lơ lửng trong Firebug "dính" không?
- 12. Việc thực thi java.util.Iterator có sử dụng mẫu trạng thái không?
- 13. Entity Framework - Lưu thay đổi đối với các đối tượng liên quan ở trạng thái tách rời
- 14. Có thể sử dụng Kinect SDK để đếm số người vào hoặc rời khỏi phòng không?
- 15. DDD - Entity chuyển trạng thái
- 16. Cmd + bấm vào để di chuyển trạng thái chi tiết
- 17. Có thể tạo trạng thái tùy chỉnh để sử dụng trong StateListDrawable không?
- 18. Có thể thay đổi biểu tượng của thanh trạng thái (biểu tượng thông báo) động không?
- 19. Dịch vụ Góc có nên có trạng thái không?
- 20. Biểu đồ có thể tách rời khỏi ObjectContext và được gắn lại với một đối tượng khác không?
- 21. Xóa biểu tượng thông báo khỏi thanh trạng thái
- 22. PHP - trạng thái chuyển đổi
- 23. API lịch sử HTML5 - Kích thước tối đa đối tượng trạng thái có thể là bao nhiêu?
- 24. Tôi có thể tạo trạng thái có thể thay đổi bên trong bản ghi Clojure không?
- 25. Không thể loại trừ trạng thái giao diện người dùng khỏi cam kết trong xcode
- 26. Trạng thái di chuột la bàn hover Trạng thái di chuột
- 27. "... đã xảy ra lỗi khi cập nhật bối cảnh đối tượng. ObjectContext có thể ở trạng thái không nhất quán ...."
- 28. Sử dụng OpenSSL "không thể ghi" trạng thái ngẫu nhiên "có nghĩa là gì?
- 29. Khi nào sử dụng bean phiên trạng thái trên bean phiên không trạng thái?
- 30. Việc cập nhật Thông báo có xóa trạng thái tiền cảnh của Dịch vụ không?
Điều này có vẻ giống như một bản sao của http://stackoverflow.com/q/7027523/576911. Xem câu trả lời này: http://stackoverflow.com/questions/7027523/what-can-i-do-with-a-moved-from-object/7028318#7028318 cho câu hỏi đó thảo luận về các hoạt động được phép về mặt điều kiện tiên quyết. –