Есть класс:
class T {
private:
int t;
public:
T(){
t = 1;
}
~T() {
t = 0;
}
T(T&& right) :t(right.t) {
right.t = 0;
}
T& operator=(T&& right) {
t = right.t;
}
T(const T&) = delete;
T& operator=(const T& right) = delete;
};
Он используется следующим образом:
...
T fn() {
T t;
return move(t);
}
...
T t1(fn());
Насколько я понял идею std::move, вызов в return move(t) должен осуществить перемещение данных класса t в t1 без вызова деструктора. На практике отладчик показал, что деструктор вызывается. Хотелось бы понять, почему так происходит.
Кроме того, по возможности, скажите, как изменить существующий реальный класс в этой ситуации. В реальной программе T содержит объект fstream, а в деструкторе осуществляется закрытие потока. При передаче владения объектом T (вызове move) закрывать файловый поток нельзя. Изменение поведения деструктора возможно, но это наименее приятное решение, т.к. в теряется основная идея - автоматическое освобождение ресурса при разрушении объекта. Использовать shared_ptr так же не хотелось бы.