#c
Вопрос:
существует следующий код:
struct RenderableAtmosphere {
std::unique_ptr<Atmosphere> atmosphere;
float hScaleFactor, parentEarthSizeCoefficient;
bool isUseToneMapping = false;
};
struct RenderableSceneComponent {
...
std::vector<RenderableAtmosphere> atmospheres;
};
...
RenderableSceneComponent uranusSystemComponent;
uranusSystemComponent.atmospheres = vector<RenderableAtmosphere>{move(renderableUranusAtmosphere)};
//uranusSystemComponent.atmospheres.push_back(move(renderableUranusAtmosphere));
В случае вызова оператора назначения перемещения код не компилируется со следующим набором ошибок:
In file included from D:/MinGW/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c /vector:62,
from D:ClionOpenGL_ProjectsCourseWork_SolarSystemsrcAuxiliary_Modules/Camera.h:5,
from D:ClionOpenGL_ProjectsCourseWork_SolarSystemsrcAuxiliary_Modules/AuxiliaryModules.h:4,
from D:ClionOpenGL_ProjectsCourseWork_SolarSystemsrcApplication.h:3,
from D:ClionOpenGL_ProjectsCourseWork_SolarSystemsrcApplication.cpp:1:
D:/MinGW/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c /bits/stl_construct.h: In instantiation of 'void std::_Construct(_T1*, _Argsamp;amp; ...) [with _T1 = RenderableAtmosphere; _Args = {const RenderableAtmosphereamp;}]':
D:/MinGW/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c /bits/stl_uninitialized.h:83:18: required from 'static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = const RenderableAtmosphere*; _ForwardIterator = RenderableAtmosphere*; bool _TrivialValueTypes = false]'
D:/MinGW/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c /bits/stl_uninitialized.h:134:15: required from '_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = const RenderableAtmosphere*; _ForwardIterator = RenderableAtmosphere*]'
D:/MinGW/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c /bits/stl_uninitialized.h:289:37: required from '_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>amp;) [with _InputIterator = const RenderableAtmosphere*; _ForwardIterator = RenderableAtmosphere*; _Tp = RenderableAtmosphere]'
D:/MinGW/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c /bits/stl_vector.h:1464:33: required from 'void std::vector<_Tp, _Alloc>::_M_range_initialize(_ForwardIterator, _ForwardIterator, std::forward_iterator_tag) [with _ForwardIterator = const RenderableAtmosphere*; _Tp = RenderableAtmosphere; _Alloc = std::allocator<RenderableAtmosphere>]'
D:/MinGW/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c /bits/stl_vector.h:519:2: required from 'std::vector<_Tp, _Alloc>::vector(std::initializer_list<_Tp>, const allocator_typeamp;) [with _Tp = RenderableAtmosphere; _Alloc = std::allocator<RenderableAtmosphere>; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<RenderableAtmosphere>]'
D:ClionOpenGL_ProjectsCourseWork_SolarSystemsrcApplication.cpp:888:102: required from here
D:/MinGW/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c /bits/stl_construct.h:75:7: error: use of deleted function 'RenderableAtmosphere::RenderableAtmosphere(const RenderableAtmosphereamp;)'
{ ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
Я не могу понять, в какой момент вызывается копия класса, которая пытается вызвать конструктор удаленной копии unique_ptr
. Но если вы пользуетесь push_back
, то все работает.
Комментарии:
1.
std::initializer_list
, которыйstd::vector
конструктор использует в качестве параметра, хранит элементы const, поэтому вы не можете перейти от него. Используйте.push_back()
для добавленияrenderableUranusAtmosphere
.2. @HolyBlackCat, черт возьми, чувак, ты прав! Спасибо
Ответ №1:
Заявление
uranusSystemComponent.atmospheres = vector<RenderableAtmosphere>{move(renderableUranusAtmosphere)};
вызывает оператор присваивания вектора:
vectoramp; operator=( const vectoramp; other );
для чего требуется конструктор копирования RenderableAtmosphere
с подписью:
RenderableAtmosphere::RenderableAtmosphere(const RenderableAtmosphereamp;)
Но RenderableAtmosphere
у него нет такого конструктора копирования, так как у него есть std::unique_ptr
член. Копировать конструкторы на cppreference.com
Вот почему вы получаете эти сообщения об ошибках.
Комментарии:
1. Нет! Это вызывает оператор назначения перемещения для временного вектора. Проблема здесь все-таки в том, что при создании этого временного вектора (я проверил),
HolyBlackCat
верно , проблема заключается в томinitializer_list
, объекты в которых являются постоянными, что делает невозможным движение из него.