2017-07-28 94 views
1

我目前正在学习C++,并且一直在阅读C++入门(第5版)C++用一个变量而不是一个常量表达式初始化一个数组

在第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]; 

,这也适用。

如果任何人有解释或为什么这项工程即使它声明它不应该我会感激它。

谢谢!

+0

请参阅[是否“int size = 10;”产生一个常量表达式?](https://stackoverflow.com/q/21273829/1708801) –

回答

4

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

您最好使用std::vector代替动态数组。如果你不熟悉如何使用那些我会建议在网上寻找的人。关于如何使用std::vector以及它是如何工作的,有很多很好的资源。

+0

啊,我看到现在使用此标志时产生的警告。我明白如何使用向量及其优点,只是想知道为什么我没有为我的代码收到任何编译器错误。所以用变量初始化一个数组不是一个推荐的事情?如果是这样,在性能方面有什么缺点,据我所知,正常的数组可能比矢量快一些,因为你确切知道你需要多少元素和内存不需要在调整大小时重新分配,使用变量进行初始化会减慢速度? – Luis

+0

我不认为它会减缓任何事情,但请记住,使用这种方法,您将占用堆栈中的内存。与堆中的内存相比,它受到了限制。因此,当使用大尺寸的可变长度数组时,您更可能发生堆栈溢出。 – Curious

+0

Gotcha,也有更多的阅读也表示,因为这是一个编译器扩展(就像你上面说的),这个代码可能无法在其他C++实现中使用,这是另一个严重的缺点。再次感谢您的帮助! – Luis

相关问题