Назад к задачам
Junior — Senior
9

Недостатки наследования от std::vector

Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

Объясните, почему наследовать от std::vector считается плохой практикой, хотя технически это возможно.

// Перемещающий оператор присваивания
_CONSTEXPR20_CONTAINER vector& operator=(vector&& _Right) noexcept(
    _Move_assign<_Right, _Choose_pocma<_Alty>>()) {
    if (this != _STD addressof(_Right)) {
        _Move_assign(_Right, _Choose_pocma<_Alty>{});
    }
    return *this;
}

// Деструктор
_CONSTEXPR20_CONTAINER ~vector() noexcept {
    _Tidy();
# if _ITERATOR_DEBUG_LEVEL != 0
    auto&& _Alproxy = _GET_PROXY_ALLOCATOR(_Alty, _Getal());
    _Delete_plain_internal(_Alproxy, _STD exchange(_Mypair._Myval2._Myproxy, nullptr));
# endif
}
// Приватный метод добавления элемента
template <class... _Valty>
_CONSTEXPR20_CONTAINER decltype(auto)
_Emplace_back_with_unused_capacity(_Valty&&... _Val) {
    auto& _My_data = _Mypair._Myval2;
    pointer& _Mylast = _My_data._Mylast;
    _STL_INTERNAL_CHECK(_Mylast != _My_data._Myend); // проверка свободного места

    _Alty_traits::construct(_Getal(), _Unfancy(_Mylast), _STD forward<_Valty>(_Val)...);
    _Orphan_range(_Mylast, _Mylast);
    _Ty& _Result = *_Mylast;
    ++_Mylast;

# if _HAS_CXX17
    return _Result;
# else
    (void)_Result;
# endif
}

Что произойдёт, если объявить такой класс:

class MyVector : public std::vector<int> {
    std::string metadata;
};