Возможные проблемы с изменением изменяемых переменных в конструкторе копирования/операторах присваивания? [дубликат] ⇐ C++
Возможные проблемы с изменением изменяемых переменных в конструкторе копирования/операторах присваивания? [дубликат]
Я реализую класс, который будет безопасно доставлять указатели вместо std::unique_ptr из-за проблемы с отсутствием конструктора копирования в std::unique_ptr.
Итак, я работаю над использованием изменяемой переменной для «перемещения» указателя внутри конструктора/оператора копирования/перемещения, но меня беспокоит, безопасно это или нет.
Приведенный ниже код — это код, реализующий эту часть.
шаблон класс PtrMover { дружественный класс PtrMover; публика: PtrMover() noException : m_Ptr(nullptr) {} PtrMover(T* _ptr) noException : m_Ptr(_ptr) {} PtrMover(const PtrMover& _copy) noException : m_Ptr(_copy.m_Ptr) { _copy.m_Ptr = nullptr; } PtrMover(PtrMover&& _move) noException : m_Ptr(_move.m_Ptr) { _move.m_Ptr = nullptr; } ~PtrMover() { если (m_Ptr) { удалить m_Ptr; } } //... оператор void = (const PtrMover& _copy) noException { //защита самоназначения если (это != &_copy) { Т* темп = m_Ptr; m_Ptr = _copy.m_Ptr; если (m_Ptr == температура) { темп = нульптр; } _copy.m_Ptr = темп; } } void оператор = (PtrMover&& _move) noException { //защита самоназначения если (это != &_move) { Т* темп = m_Ptr; m_Ptr = _move.m_Ptr; если (m_Ptr == температура) { темп = нульптр; } _move.m_Ptr = температура; } } //... частный: изменяемый T* m_Ptr; } +) Причина, по которой я хочу использовать этот класс, состоит в том, чтобы создать экземпляр std::function с использованием std::bind, поместить его в std::vector, а затем выполнить вызов задержки, но проблема в том, что я нельзя использовать std::unique_ptr в качестве параметра.
Приведенный ниже код представляет собой упрощенную версию того, что я собираюсь сделать в реальном коде.
#include #include #include класс SomeClass { публика: СомеКласс() {}; ~SomeClass() {}; }; класс DoitLater { публика: DoitLater() {}; ~DoitLater() {}; std::vector m_FrameEndJobs; шаблон встроенный void AddLaterJob(F&& _func, Args && ..._args) { //Ошибка 1 auto job = std::bind(std::forward(_func), std::forward(_args)...); m_FrameEndJobs.push_back(задание); //Ошибка 2 m_FrameEndJobs.emplace_back(std::function()); m_FrameEndJobs.back() = std::bind(std::forward(_func), std::forward(_args)...); //Ошибка 3 m_FrameEndJobs.emplace_back(std::bind(std::forward(_func), std::forward(_args)...)); //Нет ли способа? } }; интервал основной() { DoitLater позже{}; std::unique_ptr _uniqPtr = std::make_unique(); позже.AddLaterJob( [uniqPtr = std::move(_uniqPtr)]() изменяемый ->void { //Сделай что-нибудь } ); вернуть 0; } Мне не удалось найти никакой информации об этом ни в GPT, ни в Google.
[*]
Есть ли способ заставить это работать с помощью std::unique_ptr?
[*]
Если нет, могут ли возникнуть какие-либо проблемы, если вы воспользуетесь моим курсом?
Я спрашиваю, прежде чем менять всю структуру реального кода.
Я реализую класс, который будет безопасно доставлять указатели вместо std::unique_ptr из-за проблемы с отсутствием конструктора копирования в std::unique_ptr.
Итак, я работаю над использованием изменяемой переменной для «перемещения» указателя внутри конструктора/оператора копирования/перемещения, но меня беспокоит, безопасно это или нет.
Приведенный ниже код — это код, реализующий эту часть.
шаблон класс PtrMover { дружественный класс PtrMover; публика: PtrMover() noException : m_Ptr(nullptr) {} PtrMover(T* _ptr) noException : m_Ptr(_ptr) {} PtrMover(const PtrMover& _copy) noException : m_Ptr(_copy.m_Ptr) { _copy.m_Ptr = nullptr; } PtrMover(PtrMover&& _move) noException : m_Ptr(_move.m_Ptr) { _move.m_Ptr = nullptr; } ~PtrMover() { если (m_Ptr) { удалить m_Ptr; } } //... оператор void = (const PtrMover& _copy) noException { //защита самоназначения если (это != &_copy) { Т* темп = m_Ptr; m_Ptr = _copy.m_Ptr; если (m_Ptr == температура) { темп = нульптр; } _copy.m_Ptr = темп; } } void оператор = (PtrMover&& _move) noException { //защита самоназначения если (это != &_move) { Т* темп = m_Ptr; m_Ptr = _move.m_Ptr; если (m_Ptr == температура) { темп = нульптр; } _move.m_Ptr = температура; } } //... частный: изменяемый T* m_Ptr; } +) Причина, по которой я хочу использовать этот класс, состоит в том, чтобы создать экземпляр std::function с использованием std::bind, поместить его в std::vector, а затем выполнить вызов задержки, но проблема в том, что я нельзя использовать std::unique_ptr в качестве параметра.
Приведенный ниже код представляет собой упрощенную версию того, что я собираюсь сделать в реальном коде.
#include #include #include класс SomeClass { публика: СомеКласс() {}; ~SomeClass() {}; }; класс DoitLater { публика: DoitLater() {}; ~DoitLater() {}; std::vector m_FrameEndJobs; шаблон встроенный void AddLaterJob(F&& _func, Args && ..._args) { //Ошибка 1 auto job = std::bind(std::forward(_func), std::forward(_args)...); m_FrameEndJobs.push_back(задание); //Ошибка 2 m_FrameEndJobs.emplace_back(std::function()); m_FrameEndJobs.back() = std::bind(std::forward(_func), std::forward(_args)...); //Ошибка 3 m_FrameEndJobs.emplace_back(std::bind(std::forward(_func), std::forward(_args)...)); //Нет ли способа? } }; интервал основной() { DoitLater позже{}; std::unique_ptr _uniqPtr = std::make_unique(); позже.AddLaterJob( [uniqPtr = std::move(_uniqPtr)]() изменяемый ->void { //Сделай что-нибудь } ); вернуть 0; } Мне не удалось найти никакой информации об этом ни в GPT, ни в Google.
[*]
Есть ли способ заставить это работать с помощью std::unique_ptr?
[*]
Если нет, могут ли возникнуть какие-либо проблемы, если вы воспользуетесь моим курсом?
Я спрашиваю, прежде чем менять всю структуру реального кода.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение