2017-07-28 95 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

相關問題