Почему я могу переместить объект с удаленным конструктором перемещения и оператором присваивания? - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть следующие определения:

struct FileDescriptor {
    explicit FileDescriptor(int fd) : desc(fd), is_open(true) {}

    explicit operator int() { return desc; }

    FileDescriptor(const FileDescriptor &) = delete;

    FileDescriptor(FileDescriptor &&) = delete;

    FileDescriptor &operator=(const FileDescriptor &) = delete;

    FileDescriptor &operator=(FileDescriptor &&) = delete;

    ~FileDescriptor() {
        if (is_open) {
            close(desc);
        }
    }

    int desc;
    bool is_open;
};

std::string capture_out(FileDescriptor &&fd) {
    /* some code */
}

Как видите, конструктор перемещения и оператор присваивания структуры FileDescriptor явно удалены.Тем не менее, следующий код компилируется.

/* some code */
FileDescriptor fdhERR(6);

auto sERR = capture_out(std::move(fdhERR));
/* some code */

Я не очень знаком с тонкостями rvalue, но такое поведение кажется нелогичным.Почему это происходит?

1 Ответ

1 голос
/ 23 сентября 2019

capture_out() принимает в качестве параметра ссылку на rvalue, но, тем не менее, это всего лишь ссылка.std::move() - это просто тип для ссылки, на самом деле он ничего не перемещает.Ваш пример создает только один FileDescriptor объект и затем передает его по ссылке на capture_out(), второй объект не создается или не назначается, поэтому ваши удаленные конструкторы и удаленные операторы не вызываются.На самом деле ничего не копируется и не перемещается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...