Про перемещение (на примере кода)
От: Shmj Ниоткуда  
Дата: 15.03.25 12:28
Оценка: :))
Код:

#include <iostream>

class TrackedClass {
private:
    int _id;
    bool _isDesctructed = false;

public:
    // Default constructor
    TrackedClass() {
        std::cout << "Default constructor\n";
    }
    
    TrackedClass(int id) : _id(id) {
        std::cout << "Constructor id=" << id << "\n";
    }
    
    // Destructor
    ~TrackedClass() {
        _isDesctructed = true;
        std::cout << "Destructor id=" << _id << "\n";
    }

    // Copy constructor
    TrackedClass(const TrackedClass& other) {
        std::cout << "Copy constructor\n";
    }

    // Move constructor
    TrackedClass(TrackedClass&& other) noexcept {
        std::cout << "Move constructor\n";
    }

    // Copy assignment operator
    TrackedClass& operator=(const TrackedClass& other) {
        std::cout << "Copy assignment operator\n";
        return *this;
    }

    // Move assignment operator
    TrackedClass& operator=(TrackedClass&& other) noexcept {
        std::cout << "Move assignment operator\n";
        return *this;
    }
    
    void test() {
        std::cout << "desctructed=" << (_isDesctructed ? "true" : "false") << std::endl;
    }
};

class Wrapper {
private:
    TrackedClass _trackedClass;
    
public:
    Wrapper() : _trackedClass(1) {
    }
    
    TrackedClass&& take() {
        return std::move(_trackedClass);;
    }
};

TrackedClass&& fun1() {
    Wrapper w = Wrapper();
    return w.take();
}

int main(int argc, const char * argv[]) {
    TrackedClass&& t = fun1();
    t.test();
    std::cout << "test" << std::endl;
}


Тут можно запустить: https://www.programiz.com/online-compiler/7P7dO9D47lJtm

Мне нужно забрать владение над TrackedClass у Wrapper.

И вот в чем прикол. В онлайн-компиляторе вывод:

Constructor id=1
Destructor id=1
desctructed=false
test


А у меня в XCode тот же самый код:

Constructor id=1
Destructor id=1
desctructed=true
test


Т.е. если так попытаться заиметь владение — можно получить по башке, получается?

Получается в онлайн этом компилере — деструктор то вызывается, но видимо он сбрасывает значение поля? Т.е. в любом случае такое перемещение — не позволяет сохранить объект и передать.

Добавил:

TrackedClass&& fun1() {
    Wrapper w = Wrapper();
    return std::move(w.take());
}


— то же самое.
Отредактировано 15.03.2025 12:41 Shmj . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.