C++中能否用类初始化时lambda返回的int定义std::array大小?
能否用lambda生成的值定义std::array的大小?
结论:不行,你的代码无法通过编译,核心原因和替代方案如下:
核心原因
std::array是模板容器,它的大小(模板参数)必须是编译期常量表达式——也就是编译器在编译阶段就能确定具体数值的量。而你通过lambda计算得到的nvars,是在对象构造的运行时才确定的,哪怕它被声明为const成员变量,也不属于编译期常量,编译器无法用它来确定std::array的固定大小。
替代方案
方案1:改用std::vector(最适合你的场景)
std::vector是动态容器,大小可以在运行时确定,完全匹配你的需求。修改后的代码如下:
#include <vector> #include <iostream> class Test1 { public: Test1(std::vector<int> vec1) : nvars(vec1.size() + 1), arr(nvars, 0) // 初始化vector,大小为nvars,元素默认值为0 {}; const int nvars; const std::vector<int> arr; // 替换为vector }; int main() { std::vector<int> vec{1,2,3,4}; Test1 test1(vec); std::cout << "nvars: " << test1.nvars << std::endl; std::cout << "arr size: " << test1.arr.size() << std::endl; return 0; }
方案2:用编译期常量确定array大小(仅适用于固定大小场景)
如果你的输入大小能在编译期确定(比如用std::array而非std::vector作为构造参数),可以用constexpr来计算大小:
#include <array> #include <iostream> template<size_t N> class Test1 { public: constexpr Test1(const std::array<int, N>&) : nvars(N + 1), arr{} {}; const int nvars; const std::array<int, N + 1> arr; }; int main() { std::array<int, 4> vec{1,2,3,4}; Test1 test1(vec); std::cout << "nvars: " << test1.nvars << std::endl; return 0; }
但这个方案不适合你当前用std::vector的场景,因为vector的大小是运行时动态变化的。
给初学者的建议
- 明确编译期常量和运行时常量的区别:编译期常量是编译时就能确定值的(比如
constexpr int a = 10;),运行时常量是程序运行后才确定的(比如你的nvars)。 - 容器选择原则:
std::array适合大小固定且编译期已知的场景,std::vector适合大小需要动态调整或运行时确定的场景。 - 类的
const成员变量如果是在构造函数初始化列表中赋值的,本质还是运行时确定的值,不能作为编译期常量使用。
内容的提问来源于stack exchange,提问作者Javier Garcia
相关产品推荐
相关产品推荐

