【问题标题】:C++ Initializing an array with a variable and not a constant expressionC ++用变量而不是常量表达式初始化数组
【发布时间】:2017-07-28 01:46:31
【问题描述】:

我目前正在学习C++,一直在阅读C++ Primer (5th Edition)

在讨论数组和初始化它们的第 3.5 章中,它说数组必须使用常量表达式进行初始化。

这是书中的一个例子

unsigned cnt = 42; // not a constant expression
constexpr unsigned sz = 42; // constant expression
int arr[10]; // array of ten ints
int *parr[sz]; // array of 42 pointers to int
string bad[cnt]; // error: cnt is not a constant expression
string strs[get_size()]; // ok if get_size is constexpr, error otherwise”

Excerpt From: Stanley B. Lippman. “C++ Primer, Fifth Edition.” 

但是,当我使用 g++ -std=c++11 尝试此操作时,一切都编译得很好。所以我有点困惑,这只是书中的一个错误,还是自本书编写以来标准已被修改,即使书中声明它使用 C++ 11。

这是我正在使用的实际代码,编译和运行都非常好

unsigned int cnt = 42; // not constant expression
constexpr unsigned int sz = 42; // constant expression

int arr[10]; // array of 10 ints
int *parr[sz]; // array of 10 int pointers
string bad[cnt];

我什至尝试过这样的事情

int var = 2;
int size = var;
int int_arr[size];

这也有效。

如果有人有解释或为什么它会起作用,即使它表明它不应该,我会很感激。

谢谢!

【问题讨论】:

标签: c++ arrays c++11 variables constants


【解决方案1】:

可变长度数组是内置在 C++11 编译器中的扩展,不是标准的,如果您使用 -Wvla 标志进行编译,您将看到编译器为您的代码发出错误。

您最好将std::vector 用于动态数组。如果您不熟悉如何使用这些,我建议您在网上四处看看。有很多很好的资源详细介绍了如何使用 std::vector 以及它是如何工作的。

【讨论】:

  • 啊,我确实看到使用此标志时生成的警告。我了解如何使用向量及其好处,只是想知道为什么我的代码没有出现任何编译器错误。所以用变量初始化数组不是推荐的事情吗?如果是这样,在性能方面有什么缺点,据我了解,普通数组可能比向量快一点,因为您确切知道需要多少元素并且在调整大小时不需要重新分配内存,使用变量初始化会减慢速度吗?
  • 我认为它不会减慢任何速度,但请记住,使用这种方法会占用堆栈上的内存。与堆上的内存相比,这是受限制的。因此,当使用大尺寸的可变长度数组时,您更有可能发生堆栈溢出。
  • Gotcha,更多的阅读也表明,由于这是一个编译器扩展(就像你上面所说的),这个代码可能在其他 C++ 实现中不起作用,这是另一个严重的缺点。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多