【问题标题】:usage of const in c++C++中const的使用
【发布时间】:2013-10-01 03:39:06
【问题描述】:

我是 C++ 新手。我正在阅读一本 C++ 书,上面写着

const int i[] = { 1, 2, 3, 4 };
float f[i[3]]; // Illegal

编译时说float变量的声明无效,这是为什么呢?

假设我们使用

int i = 3;
float f[i];

有效。

第一种情况有什么问题?

谢谢。

【问题讨论】:

  • 你的第二种情况也是非法的。请注意,it workslegal 太不同了!
  • @Walter 两个不同的东西,甚至...
  • @twalberg 可以解释为“它们之间的差异太大而无法忽视”

标签: c++ compilation compiler-errors constants


【解决方案1】:

所以第一个是非法的,因为数组必须有一个编译时已知的界限,而i[3],虽然严格来说在编译时是已知的,但不满足语言为“编译时已知”设置的标准。

出于同样的原因,第二个也是非法的。

但是,GCC 通常会接受这两种情况,因为它支持 C99 样式的运行时大小的数组作为 C++ 中的扩展。将 -pedantic 标志传递给 GCC 以使其抱怨。

编辑: C++ 标准术语是“整数常量表达式”,符合条件的内容在标准的第 5.19 节中有详细描述。确切的规则是不平凡的,C++11 有更广泛的东西,由于constexpr,但在 C++98 中,合法的东西列表大致是:

  • 整数字面量
  • 仅包含常量的简单表达式
  • 整型的非类型模板参数
  • 声明为const并使用常量表达式初始化的整型变量

【讨论】:

  • 您能否通过一些关于编译时已知界限的说明...谢谢。
【解决方案2】:

您的第二个示例不起作用,也不应该起作用。 i 必须是常数。这行得通

const int i = 3;
float f[i];

【讨论】:

  • 如果未设置某些标志(例如 -pedantic),它将在某些编译器(例如 gcc)上工作(即按预期编译和执行)。但是,这并不意味着根据标准它是合法的。
  • 好的,我知道了。 const int const i[4] = {1, 2, 3, 4}; 也不起作用,至少在 Visual Studio 2010 中是这样。据我了解,在 C++11 中它将是 constexpr
  • 这取决于使用情况(在这种情况下,它仍然是const)。有关constconstexpr 之间的区别,请参阅stackoverflow.com/questions/4748083/…stackoverflow.com/questions/13346879/…
【解决方案3】:

只是为了阐述塞巴斯蒂安的回答:

当你创建一个静态数组时,编译器必须知道它需要保留多少空间。这意味着数组大小必须在编译时已知。换句话说,它必须是文字或常量:

const int SIZE = 3;
int arr[SIZE]; // ok

int arr[3]; // also ok

int size = 3;
int arr[size]; // Not OK

由于size 的值在创建数组时可能会有所不同,因此oompiler 将不知道要为数组保留多少空间。如果你声明为const,它知道值不会改变,并且可以保留适当的空间。

如果您需要一个可变大小的数组,则需要使用new 动态创建它(并确保在完成后使用delete 清理它)。

【讨论】:

【解决方案4】:

对于只有在 C++ 运行时才知道长度的数组,我们有 std::vector<T>。对于内置数组,大小必须在编译时已知。对于 C++11 也是如此,尽管更早的 C99 标准已经支持动态堆栈数组。另请参阅Why doesn't C++ support dynamic arrays on the stack? 接受的答案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多