Нежелательный вызов конструктора копирования при создании Shared_ptr ⇐ C++
-
Anonymous
Нежелательный вызов конструктора копирования при создании Shared_ptr
При выполнении некоторых упражнений по кодированию я столкнулся со следующей ошибкой при попытке передать право владения необязательным std::unique_ptr в std::shared_ptr: /usr/include/c++/11/ext/new_allocator.h:162:11: ошибка: использование удаленной функции 'std::unique_ptr::unique_ptr(const std::unique_ptr &) [с _Tp = беззнаковый символ; _Dp = std::default_delete]’ 162 | { ::new((void *)__p) _Up(std::forward(__args)...); } | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~ В файле, включенном из /usr/include/c++/11/memory:76, из main.cpp:2: /usr/include/c++/11/bits/unique_ptr.h:468:7: примечание: объявлено здесь 468 | unique_ptr(const unique_ptr&) = удалить; | ^~~~~~~~~~ Это был конкретный фрагмент, который привел к моей ошибке (извиняюсь за бессмысленный код):
#include #include класс test_class { публика: параметры структуры { параметры(); std::optional данные; }; test_class(const test_class::options &options = test_class::options()); частный: std::shared_ptr _data; }; test_class::test_class( const test_class::options &options) { если (options.data.has_value()) { _data = std::make_shared(std::move(options.data.value())); } } Я предполагал, что обойду любые конструкторы копирования, используя вызов std::move, но похоже, что я все равно случайно его вызываю.
Более того, я выполнил аналогичный фрагмент кода, но ошибки не было:
test_class::test_class( const test_class::options &options) { std::optional данные; если (data.has_value()) { _data = std::make_shared(std::move(data.value())); } } Кто-нибудь может объяснить, почему это происходит? Почему первый фрагмент неправильный? Есть ли какие-то фундаментальные принципы C++, которые я не понимаю? Почему второй фрагмент также не терпит неудачу?
Спасибо!
При выполнении некоторых упражнений по кодированию я столкнулся со следующей ошибкой при попытке передать право владения необязательным std::unique_ptr в std::shared_ptr: /usr/include/c++/11/ext/new_allocator.h:162:11: ошибка: использование удаленной функции 'std::unique_ptr::unique_ptr(const std::unique_ptr &) [с _Tp = беззнаковый символ; _Dp = std::default_delete]’ 162 | { ::new((void *)__p) _Up(std::forward(__args)...); } | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~ В файле, включенном из /usr/include/c++/11/memory:76, из main.cpp:2: /usr/include/c++/11/bits/unique_ptr.h:468:7: примечание: объявлено здесь 468 | unique_ptr(const unique_ptr&) = удалить; | ^~~~~~~~~~ Это был конкретный фрагмент, который привел к моей ошибке (извиняюсь за бессмысленный код):
#include #include класс test_class { публика: параметры структуры { параметры(); std::optional данные; }; test_class(const test_class::options &options = test_class::options()); частный: std::shared_ptr _data; }; test_class::test_class( const test_class::options &options) { если (options.data.has_value()) { _data = std::make_shared(std::move(options.data.value())); } } Я предполагал, что обойду любые конструкторы копирования, используя вызов std::move, но похоже, что я все равно случайно его вызываю.
Более того, я выполнил аналогичный фрагмент кода, но ошибки не было:
test_class::test_class( const test_class::options &options) { std::optional данные; если (data.has_value()) { _data = std::make_shared(std::move(data.value())); } } Кто-нибудь может объяснить, почему это происходит? Почему первый фрагмент неправильный? Есть ли какие-то фундаментальные принципы C++, которые я не понимаю? Почему второй фрагмент также не терпит неудачу?
Спасибо!
Мобильная версия