Нежелательный вызов конструктора копирования при создании Shared_ptrC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Нежелательный вызов конструктора копирования при создании Shared_ptr

Сообщение Anonymous »


При выполнении некоторых упражнений по кодированию я столкнулся со следующей ошибкой при попытке передать право владения необязательным 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++, которые я не понимаю? Почему второй фрагмент также не терпит неудачу?

Спасибо!
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»