Всем привет.
Немного перефразирую тему. Представим, что мы пишем аналог std::vector и его функции push_back. Фишка в том, что эта функция бывает в двух вариантах: копирование и перемещение; из документации:
void push_back (const value_type& val);
void push_back (value_type&& val);
template<class TValue, typename TIndex>
TIndex CSet<TValue,TIndex>::Add(const TValue &value)
{
TIndex result;
TValue copyValue(value);
result=Add( std::move(copyValue) ); // Функция добавления с перемещением
return result;
}
------
std2.cpp: In instantiation of ‘TIndex CSet<TValue, TIndex>::Add(const TValue&) [with TValue = CElement; TIndex = TElementKey]’:
std2.cpp:1366:2: required from here
std2.cpp:713:24: error: use of deleted function ‘CElement::CElement(const CElement&)’
TValue copyValue(value);
^
std2.cpp:556:2: error: declared here
CElement(const CElement ©Value)=delete;
^
Как сделать шаблонный класс с поддержкой и копирования, и перемещения (rvalue), и чтобы это работало с типом без конструктора копирования? Ведь в std::vector это как-то делают?
P. S. Исходник std::vector::push_back мне взрывает моск строкой с _Alloc_traits . Думаю, ответ именно в этой строке, но никак не могу его ухватить. Поможете?
void
push_back(const value_type& __x)
{
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
{
_Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
__x);
++this->_M_impl._M_finish;
}
else
#if __cplusplus >= 201103L
_M_emplace_back_aux(__x);
#else
_M_insert_aux(end(), __x);
#endif
}
#if __cplusplus >= 201103L
void
push_back(value_type&& __x)
{ emplace_back(std::move(__x)); }