为什么常量变量有时不被视为编译时常量
why constant variables are not treated as compile time constant sometime
我尝试执行两种不同的场景:
场景 1:
const auto arraySize = 10; // fine, arraySize is constant
std::array<int, arraySize> data;
在这里,arraySize 被视为编译时常量,因此在 std::array 中是允许的。
场景 2:
int sz=10;
const auto arraySize = sz; // fine .
std::array<int, arraySize> data; //error , arraySize is not compile time constant .
在场景 2 中,arraySize 不被视为编译时常量,尽管 arrySize 是 sz 的常量副本。
为什么这两种情况被区别对待?
因为它可以像
int sz = 0;
std::cin >> sz;
const auto arraySize = sz;
这里 sz
的值是在运行时定义的。您可以使用constexpr
,而不是const
,而不是在此类初始化时编译错误。
您可能应该考虑使用 constexpr
.
int sz=10;
是设置为某个常量的变量。编译器可能足够聪明(也可能不够聪明!),可以在优化时不断传播它。
相关文章:
- C++常量数组的编译时间较长
- 在编译时将常量字符* 转换为常量 char_type*
- 将编译时常量向量转换为堆分配版本
- 如何在常量计算表达式中获取编译时错误?
- 如何在编译时解析静态常量 std::string?
- 有没有办法在类实例中存储编译时常量?
- 检测编译时文本和常量
- ARM C++编译器不会编译具有可变常量成员的结构
- 强制在编译时计算类的类的常量成员
- Constexpr 类采用常量引用不编译
- 为什么对数组的常量左值引用不编译在下面?
- 由于缺少常量而出现编译错误
- 为什么在将常量 ptr 分配给常量引用时没有收到编译错误?
- 为什么可以在编译时访问非常量、非静态成员而无需类的实例
- 不是 VS2017 中的编译时常量表达式
- 将编译时定义大小的数组初始化为常量表达式
- 将大小为编译时常量的数组初始化为单个值
- 如何为 std::array 声明全局编译时常量?
- 返回非常量引用编译的 Const 方法
- 常量正确性编译错误到模板函数中的无效转换错误