Конструктор перемещения и константные переменные-члены

Мне нравится идея константных переменных-членов, особенно когда я заключаю функции C в классы. Конструктор принимает дескриптор ресурса (например, дескриптор файла), который остается действительным в течение всего времени жизни объекта, а деструктор, наконец, закрывает его. (Это идея RAII, верно?)

Но с конструктором перемещения C ++ 0x я столкнулся с проблемой. Поскольку деструктор также вызывается для «выгруженного» объекта, мне нужно предотвратить очистку дескриптора ресурса. Поскольку переменная-член является константой, у меня нет способа присвоить значение -1 или INVALID_HANDLE (или эквивалентные значения), чтобы указать деструктору, что он не должен ничего делать.

Есть ли способ, которым деструктор не вызывается, если состояние объекта было перемещено на другой объект?

Пример:

class File
{
public:
    // Kind of "named constructor" or "static factory method"
    static File open(const char *fileName, const char *modes)
    {
        FILE *handle = fopen(fileName, modes);
        return File(handle);
    }

private:
    FILE * const handle;

public:
    File(FILE *handle) : handle(handle)
    {
    }

    ~File()
    {
        fclose(handle);
    }

    File(File &&other) : handle(other.handle)
    {
        // The compiler should not call the destructor of the "other"
        // object.
    }

    File(const File &other) = delete;
    File &operator =(const File &other) = delete;
};
27
задан mazatwork 11 June 2011 в 17:25
поделиться