【问题标题】:why constant variables are not treated as compile time constant sometime [duplicate]为什么常量变量有时不被视为编译时常量[重复]
【发布时间】:2016-01-21 09:35:40
【问题描述】:

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

场景 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 中,尽管 arrySize 是 sz 的常量副本,但 arraySize 不被视为编译时常量。

为什么要区别对待这两种情况?

【问题讨论】:

  • arraySize常量的常量副本...?
  • 因为const 并不意味着“编译时间常数”。在某些情况下,它可以是编译时的,但不能保证,因此您不能在需要编译时常量的上下文中使用它们。请改用constexpr

标签: c++ c++11 constants stdarray


【解决方案1】:

因为它可以像

int sz = 0;
std::cin >> sz;
const auto arraySize = sz;

这里sz 的值是在运行时定义的。您可以使用constexpr,而不是const,这样初始化时会出现编译错误。

【讨论】:

    【解决方案2】:

    您可能应该考虑使用constexpr

    int sz=10; 是一个设置为某个常数的变量。编译器可能足够聪明(或不够聪明!)在优化时不断传播它。

    【讨论】:

      猜你喜欢
      • 2012-09-07
      • 2012-02-23
      • 1970-01-01
      • 2012-10-19
      • 2011-10-14
      • 1970-01-01
      • 2012-08-31
      相关资源
      最近更新 更多