Задать вопрос
@communistic_sistema
Биохимик, но в программировании немного шарю

Почему возникает ошибка C2512 в конструкторе с std::initializer_list?

У меня есть 2 структуры, первая - обертка массива, вторая - данные что будут положены в массив.
Конструктор первой с std::initializer_list:
static_array(std::initializer_list<type> il)
requires std::is_copy_constructible_v<type> {
	if (il.size() != N) {
		throw invalid_range();
	}
	pointer iter = begin();
	for (const_type& val : il) {
		place_at(iter, val);
		++iter;
	}
}

Конструкторы второй:
c_function(func* body, const metadata& meta, destructor* args_destructor = nullptr);
c_function(func* body, metadata&& meta, destructor* args_destructor = nullptr);
c_function(const c_function& other) : _meta(other.get_meta()), _body(other.get_body()), _args_destructor(other.get_args_destructor()) {};
c_function(c_function&& other) noexcept;

Почему в записи:
c_function s1(nullptr, {});
c_function s2(nullptr, {});
static_array<c_function, 2> sa = static_array<c_function, 2>{ abc };

У меня возникает ошибка C2512. Я ведь нигде ничего по умолчанию не создаю. Откуда она?
При этом создание просто std::initializer_list с c_function не вызывает никаких ошибок!
std::initializer_list<c_function> abc = { c_function(nullptr, {}) };
  • Вопрос задан
  • 68 просмотров
Подписаться 1 Простой 9 комментариев
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
У вас конструктор не передает initializer_list в поле arr[N], а сначала конструирует массив по умолчанию, а потом туда копирует ручками значения из initializer_list. Перед выполнением тела конструктора вся память должна быть выделена и все не иницилизированные явно поля инициализируются по умолчанию.

В качестве решения можно весь ваш ручной код выкинуть и передать список в конструктор arr:
static_array(std::initializer_list<type> il)
		requires std::is_copy_constructible_v<type> : 
        arr(std::forward(il)) {}


Если хотите проверить длину списка, можно это все еще сделать потом в теле конструктора.
Аналогично в остальных случаях.

Но вообще, можно не расписывать разные конструкторы, а сделать только один static_array(T&& init), где этот init и передавать в конструктор arr.

Если вы так хотите руками данные копировать через ваш place_at, то вам надо ваш array сделать типа char или uint8_t, выровнять и задать нужный размер через sizeof(type). Простой случай показан тут.

А вообще, чем вам std::array не нравится?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы