Задать вопрос
@Acaunt

Безопасно ли преобразование reinterpret_cast из указателя в массив?

Немного эксперементируя понял, что вроде бы код полностью работает:

template<int size>
void foo() {
	int* a = new int[size];

	for (int i = 0; i < size; ++i) {
		a[i] = i + 1;
	}

	for (auto& i : (int(&)[size])(*a)) {
		std::cout << i << " ";
	}
	std::cout << std::endl;

	// Или

	for (auto& i : reinterpret_cast<int(&)[size]>(*a)) {
		std::cout << i << " ";
	}
	std::cout << std::endl;

	delete[] a;
}


Но почему то есть небольшие сомнения, и в тоже время иногда хотелось бы использовать это

Например я реализовал вот такой многомерный массив с возможностью представления его плоским и тоже всё работает:

template<class T, size_t N, size_t ... SIZES>
struct Array : std::array<Array<T, SIZES ...>, N> {
	static constexpr size_t size() {
		return N;
	}

	static constexpr size_t total_size() {
		return N * Array<T, SIZES ...>::total_size();
	}

	auto flat() -> T(&)[total_size()] {
		return reinterpret_cast<T(&)[total_size()]>(*this);
	}

	auto flat() const -> const T(&)[total_size()] {
		return reinterpret_cast<const T(&)[total_size()]>(*this);
	}
};

template<class T, size_t N>
struct Array<T, N> : std::array<T, N> {
	static constexpr size_t size() {
		return N;
	}

	static constexpr size_t total_size() {
		return N;
	}

	auto flat() -> T(&)[total_size()] {
		return reinterpret_cast<T(&)[total_size()]>(*this);
	}

	auto flat() const -> const T(&)[total_size()] {
		return reinterpret_cast<const T(&)[total_size()]>(*this);
	}
};

int main() {
	Array<int, 2,3> a {
		1,2,3,
		4,5,6
	};

	for (auto& line : a) {
		for (auto& value : line) {
			std::cout << value << " ";
		}
		std::cout << std::endl;
	}

	for (auto& value : a.flat()) {
		std::cout << value << " ";
	}
}


я тут полагался на то что std::array по идее внутри себя имеет только голый массив, и при такой рекурсивной реализации тоже получаются все элементы в одной области памяти находятся
  • Вопрос задан
  • 14 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Академия Эдюсон
    Разработчик игр на Unreal Engine + ИИ
    9 месяцев
    Далее
  • Stepik
    Профессия: Разработчик C++ (Junior)
    2 месяца
    Далее
Пригласить эксперта
Ваш ответ на вопрос

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

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