Мне нравится идея константных переменных-членов, особенно когда я заключаю функции 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;
};