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());
Preconditions: T is Cpp17CopyInsertable into *this.
Effects: Constructs a vector with n copies of value, using the specified allocator. Цитата
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 шт):
Если вектор создали во время компиляции, он должен и умереть во время компиляции. Например, он может быть локальной переменной в constexpr
функции, но сам не обязательно константный.
В общем случае, память выделенная через new
во время компиляции, должна быть освобождена через delete
тоже во время компиляции. Видимо потому, что иначе непонятно, как перенести ее в кучу при запуске приложения.