클래스에 기본 생성자가 없으므로 내부 변수가 항상 초기화되어야하므로 이동 생성자가 없어야합니다.기본 생성자로 인해 생성자가 생성되지 않습니다.
는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_;
};
이 클래스는 항상 내부 문자열이 비어 있지 않은 문자열로 설정하고 내부 문자열이 Example
객체 사이에 복사됩니다 기대하고있다. 예제가 옮겨지면 std::move
호출을 통해 문자열을 비워 두어야하기 때문에 move 생성자가 여기에 적용되지 않는다는 것을 수정 했습니까?
음, * clients *가 비공개 (* "default"*) 객체를 생성 할 수없는 한 * 왜 * (* 라이브러리 자체)는 그렇게 할 수 없습니까? 물론 클라이언트가 직접 생성 할 수없는 한 기본 객체가 돌아 다니는 데 문제가 없습니다. 그리고 일반적으로 클라이언트는 어쨌든 객체로부터 옮겨진 것에 대해 아무 것도 가정하지 말아야합니다 (파괴 불가능하고 아마도 할당 가능하다는 점을 제외하고). 그들은 일부 (숨겨진) 기본 상태에 있다는 것을 모릅니다. –
짐작할 수 있겠지만, 이것은 내가 얻는 것입니다. 객체를 옮기고 나면 어떤 상태에 있어야합니까? 나는 그것이 '유효한'상태, 예를 들어 매달려있는 포인터가 아니어야한다는 것을 읽었지만'move' 생성자가'move_object == Object()'와 같이 객체를 디폴트 상태로 두도록 구현했습니다. –