Можно ли реализовать constexpr static_vector?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Можно ли реализовать constexpr static_vector?

Сообщение Anonymous »

Можно ли реализовать constexpr static_vector?
Под static_vector я имею в виду вектор, пространство для хранения которого находится внутри вектора (не выделенная куча), и он не может выйти за пределы CAPACITY времени компиляции. Примерно так:

Код: Выделить всё

template 
struct static_vector {
unsigned char data[sizeof(T)*CAPACITY];
int size = 0;

template 
constexpr void emplace_back(PARAMETERS &&...parameters) {
new(data + size * sizeof(T)) T(std::forward(parameters)...);
size++;
}

constexpr const T &operator[](int idx) const {
return std::launder(reinterpret_cast(data))[idx];
}
};
(надеюсь, эта реализация не содержит UB).
Если я попытаюсь использовать эту реализацию, я получу различные ошибки, связанные с constexpr. Вот небольшая тестовая программа (godbolt):

Код: Выделить всё

struct Foo {
int x;

constexpr Foo(int x) : x(x) { }
};

constexpr int fn() {
static_vector a;
a.emplace_back(1);
a.emplace_back(2);
return a[0].x + a[1].x;
}

int main() {
constexpr int v = fn();
printf("%d\n", v);
}
Насколько мне известно, это можно сделать, если используется выделенная куча память. Вопрос в том, можно ли сделать это, используя «встроенное» пространство, как это делает static_vector? Я знаю, что это невозможно в старых стандартах, но будет ли в следующем стандарте что-то, что сделает это возможным?
(Я также пытался реализовать это с помощью объединения code>, но он выходит из строя по-другому)

Подробнее здесь: https://stackoverflow.com/questions/791 ... tic-vector
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»