Nếu một lớp không có một hàm tạo mặc định vì nó luôn luôn khởi tạo các biến nội bộ của nó, nó có làm theo nó không nên có một hàm khởi động di chuyển không?Không có hàm tạo mặc định nào không dẫn đến hàm tạo di chuyển không?
class Example final {
public:
explicit Example(const std::string& string) : string_(
string.empty() ? throw std::invalid_argument("string is empty") : string) {}
Example(const Example& other) : string_(other.string_) {}
private:
Example() = delete;
Example(Example&& other) = delete;
Example& operator=(const Example& rhs) = delete;
Example& operator=(Example&& rhs) = delete;
const std::string string_;
};
Lớp này luôn mong muốn chuỗi nội bộ được đặt bằng chuỗi không trống và chuỗi nội bộ được sao chép giữa các đối tượng Example
. Tôi có chính xác rằng một nhà xây dựng di chuyển không áp dụng ở đây bởi vì nếu một ví dụ đã được di chuyển nó sẽ phải để lại chuỗi rỗng thông qua một cuộc gọi std::move
?
Vâng, miễn là * khách hàng * không thể tạo đối tượng trống (* "mặc định" *) khi chúng không được giả định, tại sao không * bạn * (chính thư viện) được phép làm như vậy. Tất nhiên không có vấn đề với một đối tượng mặc định bay xung quanh, miễn là khách hàng không thể trực tiếp xây dựng nó. Và nói chung, khách hàng không nên giả định bất cứ điều gì về việc chuyển từ đối tượng nào (ngoài việc nó có thể bị phá hủy và có thể được gán nhiều nhất). Họ không biết nó ở một số trạng thái mặc định (nếu không được ẩn), họ chỉ biết nó được di chuyển từ đó. –
Tôi đoán, đây là những gì tôi nhận được tại: một khi bạn đã di chuyển một đối tượng, nó nên ở trong trạng thái nào? Tôi đã đọc rằng nó phải ở trạng thái 'hợp lệ', ví dụ, không có con trỏ lơ lửng, vv nhưng tôi đã luôn luôn triển khai các hàm khởi tạo 'move' khi rời khỏi đối tượng trong trạng thái mặc định để' move_object == Object() '. –