У меня есть следующие определения:
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, но такое поведение кажется нелогичным.Почему это происходит?