在什么情况下/以什么方式可以创建编译时常量向量?
例如。C++ 对字符串发誓
constexpr auto vvv0 = std::vector<int>(4, 0);
海湾合作委员会:
“constexpr”变量“vvv0”的类型“const std::vector”不是文字
铛:
constexpr 变量不能具有非文字类型 'const std::vector'
视觉工作室:
表达式必须具有常量值 解释器存储地址的使用无效
尽管这里的向量显然是从文字生成的。标准说
22.3.11.2 构造函数、复制和赋值
constexpr vector(size_type n, const T& value, const Allocator& = Allocator());
前提条件:T 是 Cpp17CopyInsertable into *this。
效果:使用指定的分配器构造一个具有 n 个值副本的向量。引用
复杂度:与 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);
}
在什么情况下/以什么方式可以创建编译时常量向量?
(当然,这个问题不仅适用于向量,也不仅适用于作为示例选择的构造函数)
如果一个向量是在编译期间创建的,那么它必须在编译期间消亡。例如,它可以是
constexpr
函数中的局部变量,但本身不一定是常量。一般来说,
new
编译时分配的内存必须delete
在编译时释放。显然是因为否则不清楚如何在应用程序启动时将其移动到堆。