std::vector не может быть constexpr?

В каких случаях/каким способом я могу создать константный вектор времени компиляции?

Вот например. С++ ругается на строку

constexpr auto vvv0 = std::vector<int>(4, 0);

gcc:

the type 'const std::vector' of 'constexpr' variable 'vvv0' is not literal

clang:

constexpr variable cannot have non-literal type 'const std::vector'

Visual Studio:

выражение должно иметь константное значение недопустимое использование адреса хранилища интерпретатора

Хотя тут явно вектор порожден от литералов. И в стандарте написано, что

22.3.11.2 Constructors, copy, and assignment

constexpr vector(size_type n, const T& value, const Allocator& = Allocator());

  1. Preconditions: T is Cpp17CopyInsertable into *this.

  2. Effects: Constructs a vector with n copies of value, using the specified allocator. Цитата

  3. Complexity: Linear in n. ...

Интересно, что в исходниках QT конструкторы вектора не constexpr)))) А вот в Visual Studio вполне себе

    constexpr vector(const size_type _Count, const _Ty& _Val, const _Alloc& _Al = _Alloc())
        : _Mypair(_One_then_variadic_args_t{}, _Al) {
        _Construct_n(_Count, _Val);
    }

В каких случаях/каким способом я могу создать константный вектор времени компиляции?

(вопрос, естественно, относится не только к векторам и не только к конструктору, выбранному в качестве примера)


Ответы (1 шт):

Автор решения: HolyBlackCat

Если вектор создали во время компиляции, он должен и умереть во время компиляции. Например, он может быть локальной переменной в constexpr функции, но сам не обязательно константный.

В общем случае, память выделенная через new во время компиляции, должна быть освобождена через delete тоже во время компиляции. Видимо потому, что иначе непонятно, как перенести ее в кучу при запуске приложения.

→ Ссылка