常量在 C++ 中的用法
usage of const in c++
我是C++新手。我正在读一本C++书,上面写着
const int i[] = { 1, 2, 3, 4 };
float f[i[3]]; // Illegal
它说浮点变量的声明在编译期间无效。为什么?
假设如果我们使用
int i = 3;
float f[i];
它有效。
第一种情况有什么问题?
谢谢。
所以第一个是非法的,因为数组必须有一个编译时已知的边界,而i[3]
虽然严格来说在编译时已知,但不符合语言为"编译时已知"设置的标准。
出于同样的原因,第二种也是非法的。
但是,GCC 通常会接受这两种情况,因为它支持 C99 样式的运行时大小的数组作为 C++ 中的扩展。将-pedantic
标志传递给 GCC 以使其投诉。
编辑:C++标准术语是"积分常量表达式",标准第5.19节详细描述了符合条件的事物。确切的规则是不平凡的,C++11 有更广泛的事情,由于constexpr
而符合条件,但在 C++98 中,法律事物的列表大致是:
- 整数文本
- 仅涉及常量的简单表达式
- 积分型非类型模板参数
- 声明为
const
并使用常量表达式初始化的整型变量
你的第二个例子不起作用,它不应该工作。 i
必须是常量的。这行得通
const int i = 3;
float f[i];
只是为了阐述塞巴斯蒂安的回答:
创建静态数组时,编译器必须知道需要保留多少空间。 这意味着数组大小必须在编译时知道。 换句话说,它必须是文字或常量:
const int SIZE = 3;
int arr[SIZE]; // ok
int arr[3]; // also ok
int size = 3;
int arr[size]; // Not OK
由于创建数组时size
的值可能会有所不同,因此 oompiler 将不知道为数组保留多少空间。 如果将其声明为 const
,它知道该值不会更改,并且可以保留适当的空间量。
如果你需要一个可变大小的数组,你需要使用new
动态地创建它(并确保在完成它时用delete
清理它(。
对于长度仅在运行时已知的数组,C++我们有std::vector<T>
.对于内置数组,必须在编译时知道大小。对于 C++11 也是如此,尽管更旧的 C99 标准已经支持动态堆栈数组。 另请参阅为什么C++不支持堆栈上的动态数组?
- 这个指针在c++中的用法
- 当C++中需要自动删除时,这是静态的正确用法吗?
- libstdc++ 文件系统中未初始化的用法?
- 复制和交换习惯用法与移动操作之间的交互
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 命名参数习惯用法和(抽象)基类
- 省略号在C++中的所有用法
- () 在 C++ 11 中的特殊而奇怪的用法?
- 构造函数的用法
- 模板类中自动的类用法不完整
- 这里的 = 运算符有什么用法?
- 什么模板用法在阶乘中更好
- 如果可变长度元素的constexpr用法得到<>
- 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- C++ 中函数中 Const 用法之间的差异
- equal_to模板类C++用法
- PCL 中的 GICP 用法
- 向量的正确用法<int>::size_type
- C++命名空间的基本用法