为什么常量变量有时不被视为编译时常量

why constant variables are not treated as compile time constant sometime

本文关键字:常量 编译 为什么 变量      更新时间:2023-10-16

我尝试执行两种不同的场景:

场景 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;是设置为某个常量的变量。编译器可能足够聪明(也可能不够聪明!),可以在优化时不断传播它。