C++ 使用变量而不是常量表达式初始化数组
C++ Initializing an array with a variable and not a constant expression
我目前正在学习C++,一直在阅读C++入门(第5版(。
在 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++11 编译器中的扩展,不是标准的,如果使用-Wvla
标志进行编译,您将看到编译器为您的代码发出错误。
您最好将std::vector
用于动态数组。 如果您不熟悉如何使用它们,我建议您在线查看。 有很多很好的资源详细介绍了如何使用std::vector
及其工作原理。
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 使用自动推导的 lambda 参数作为常量表达式
- 生成提升::hana::set 的常量表达式问题
- 为什么不能用常量表达式声明数组?
- 不是 lambda 函数中的常量表达式
- 函数调用在常量表达式中必须具有常量值
- 错误:constexpr 变量'struct2Var'必须由常量表达式初始化
- 关于在需要常量表达式的上下文中使用的glvalue常量表达式的问题
- 生成 constexpr 字符串表,不能产生常量表达式
- 整体模板参数。错误:在常量表达式中使用'this'
- 如何在满足常量表达式的同时将整数传递给指针,传递给 std::array<double、integer>?
- 编译器错误:函数调用在常量表达式中必须有一个常量值
- 错误:'new'不能出现在常量表达式中
- 我可以写出小于 -0.5 两个 ulps 的常量表达式双精度吗?
- 编译器在传递 const 变量时返回错误:模板参数不是常量表达式
- 为什么我不能在非常量表达式上使用此模板阶乘函数?
- C++ 使用变量而不是常量表达式初始化数组
- 使用函数参数作为常量表达式的一部分 - gcc vs clang
- 片段着色器中的"错误:在 GLSL 1.30 及更高版本中禁止使用非常量表达式索引的采样器数组"