C ++使用变量而不是常量表达式初始化数组

时间:2017-07-28 01:46:31

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

我目前正在学习C ++,并且一直在阅读 C ++ Primer(第5版)

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

以下是本书的一个例子

package user;
import algorithm.bst;
...
//bst.getRootValue();

然而,当我使用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.” 尝试此操作时,一切都很好。所以我有点困惑,因为这本书是否只是一个错误,或者自从本书编写以来标准已被修改,即使本书声明它使用C ++ 11。

这是我正在使用的实际代码,它编译并运行得很好

g++ -std=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];

这也有效。

如果有人有解释或只是为什么这有效,即使它说不应该我会很感激。

谢谢!

1 个答案:

答案 0 :(得分:4)

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

您最好将std::vector用于动态数组。如果您不熟悉如何使用这些我建议在线浏览。有很多很好的资源可以详细介绍如何使用std::vector及其工作原理。