Мне известно о строгом правиле наложения типов.Однако cppreference отмечает, что
Реализация не может объявлять дополнительные нестатические члены-данные, которые занимают хранилище, не связанные с действительными и мнимыми компонентами, и должны гарантировать, что специализация шаблона класса делаетне содержат никаких дополнений.Реализация также должна гарантировать, что оптимизации для доступа к массиву учитывают возможность того, что указатель на value_type может иметь псевдоним специализации std :: complex или ее массива.
Разрешает ли это требование код, подобный следующему:быть законным, даже если это не обязательно морально?
std::size_t numDoubles = 100;
double* a = (double*) std::malloc(numDoubles * sizeof(double));
std::complex<double>* b = reinterpret_cast<std::complex<double>*>(a);
DoSomethingWith(b[1]);
Изменится ли ответ, если new [] используется для генерации двойного массива?
XY Проблема Объяснение:Я пытаюсь абстрагироваться от распределителя, предоставленного сторонней библиотекой, которая может отсутствовать;этот распределитель возвращает пустоту *;Я пытаюсь избежать попадания в заголовок информации о том, что делает библиотека.Итак, у меня есть такая структура:
// foo.h
namespace impl {
void* Allocate(std::size_t numBytes);
}
template<typename T>
T* Allocate(std::size_t num) {
static_assert(std::is_pod_v<T>);
return static_cast<T*>(Allocate(num * sizeof(T)));
}
// foo.cpp
#if LIBRARY_PRESENT
void* impl::Allocate(std::size_t numBytes) { return LibraryAllocate(numBytes); }
#else
void* impl::Allocate(std::size_t numBytes) { return std::malloc(numBytes); }
#endif
К сожалению, std :: complex не является POD, потому что он имеет нетривиальный конструктор по умолчанию.Я надеюсь, что смогу игнорировать эту проблему.