Сообщение Про перемещение (на примере кода) от 15.03.2025 12:28
Изменено 15.03.2025 12:41 Shmj
Про перемещение (на примере кода)
Код:
Тут можно запустить: https://www.programiz.com/online-compiler/7P7dO9D47lJtm
Мне нужно забрать владение над TrackedClass у Wrapper.
И вот в чем прикол. В онлайн-компиляторе вывод:
А у меня в XCode тот же самый код:
Т.е. если так попытаться заиметь владение — можно получить по башке, получается?
#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
Т.е. если так попытаться заиметь владение — можно получить по башке, получается?
Про перемещение (на примере кода)
Код:
Тут можно запустить: https://www.programiz.com/online-compiler/7P7dO9D47lJtm
Мне нужно забрать владение над TrackedClass у Wrapper.
И вот в чем прикол. В онлайн-компиляторе вывод:
А у меня в XCode тот же самый код:
Т.е. если так попытаться заиметь владение — можно получить по башке, получается?
Получается в онлайн этом компилере — деструктор то вызывается, но видимо он сбрасывает значение поля? Т.е. в любом случае такое перемещение — не позволяет сохранить объект и передать.
Добавил:
— то же самое.
#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());
}
— то же самое.