我目前正在学习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];
这也有效。
如果有人有解释或只是为什么这有效,即使它说不应该我会很感激。
谢谢!
答案 0 :(得分:4)
可变长度数组是内置于C ++ 11编译器中的扩展,并且不是标准的,如果使用-Wvla
标志进行编译,您将看到编译器为您的代码发出错误。
您最好将std::vector
用于动态数组。如果您不熟悉如何使用这些我建议在线浏览。有很多很好的资源可以详细介绍如何使用std::vector
及其工作原理。