Использование списка инициализаторов для инициализации вектора

Я не могу понять, почему мне не удается напрямую инициализировать вектор, используя следующий синтаксис:

stl::vector<int> v{1, 2, 3};

Я реализовал с нуля классы вектора и списка инициализаторов.

Конструктор вектора (есть также конструктор по умолчанию, который просто устанавливает все в 0):

vector(initializer_list<T> init) : m_capacity(init.size()), m_size(m_capacity), m_data(nullptr)
{
 this->m_data = (T *)malloc(m_size * sizeof(T));

 if (this->m_data == nullptr)
      throw "malloc: Couldn't allocate memory!\n";

 memcpy(m_data, init.begin(), m_size * sizeof(T));
}

Это мой класс инициализатора_списка:

    template <typename T> class initializer_list 
    {
    public:
        typedef const T* const_iterator;
        typedef       T* iterator;

    private:
        iterator m_begin;
        size_t   m_size;

        constexpr initializer_list(const_iterator it, size_t size) noexcept : m_begin(it), m_size(size) { }

    public:
        constexpr initializer_list() noexcept : m_begin(nullptr), m_size(0) { }

        constexpr const_iterator begin() const { return m_begin; }

        constexpr const_iterator begin(initializer_list<T> init) noexcept { return init.begin(); }

        constexpr const_iterator end() const { return m_begin + m_size; }

        constexpr const_iterator end(initializer_list<T> init) noexcept { return init.end(); }

        constexpr size_t size() const { return m_size; }
    };

Я создал отдельный конструктор в классе векторов, который принимает список инициализаторов в качестве параметра. Однако я получаю следующую ошибку:

no instance of constructor "stl::vector<T>::vector [with T=int]" matches the argument list

Это не работает, потому что для использования std::initializer_list указано использование списков инициализаторов, а не вашей собственной реализации.

Some programmer dude 08.07.2024 00:14

Не говоря уже о том, что ваш собственный список инициализаторов на самом деле не имеет места для хранения данных, которые он должен обернуть, или способа получить необходимые данные откуда угодно. Каково ваше фактическое задание? Какую основную проблему вам необходимо решить? Как вы думаете, почему нужно реализовывать свои варианты стандартных контейнеров?

Some programmer dude 08.07.2024 00:16

Если придираться, «STL» — это Стандартная библиотека шаблонов, которая послужила источником вдохновения для создания первой стандартной библиотеки. Но STL — это не то же самое, что стандартная библиотека.

Some programmer dude 08.07.2024 00:19

Это не минимальный воспроизводимый пример . Всегда публикуйте код, воспроизводящий проблему/ошибку, о которой вы заявляете. Нет stl::vector но std::vector. Скорее всего, у вас есть собственное пространство имен strl. Поэтому публикуйте реальный/реальный код вместо вырезанных фрагментов вашего кода.

user12002570 08.07.2024 07:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

std::initializer_list — это магический тип, который невозможно реализовать с помощью пользовательского кода.

Особое поведение разрешения перегрузки и списки инициализаторов в скобках работают только специально для этого магического типа std::initializer_list.

Вы не можете определить свой собственный initializer_list и надеяться, что он будет работать как std::initializer_list.

Вы также не сможете заставить работать синтаксис stl::vector<int> v{1, 2, 3}; без использования std::intializer_list. Нет никакого способа обойти его использование. Синтаксис не может быть достигнут каким-либо другим способом.

Кстати, в стандартной библиотеке есть множество этих магических типов и функций. Некоторые из них просто невозможно реализовать в пользовательском коде, и вместо этого им приходится полагаться на встроенные функции компилятора. Но некоторые, такие как std::initializer_list, также имеют особое значение для самого компилятора и даже не могут быть воспроизведены с помощью встроенных функций компилятора.

Другие вопросы по теме