将强制转换为较窄的常量位置时是否暗示到常量?
Is casting to const implied when casting to a narrower const location?
我试图尽可能地表达这一点,但一个例子是演示我的问题的好方法。考虑以下场景,其中变量long a
进入较窄的数组元素 - 本质上是const int b[0]
:
long a = 584;
const int b[4] = {(const int) a, 0, 0, 0};
考虑到 const 未显式定义,以下代码段是否等效:
long a = 584;
const int b[4] = {(int) a, 0, 0, 0};
两者都编译,但标准是否定义了这种情况和结果?
强制转换为const int
会生成类型为int
的值。没有非类类型的符合 cv 条件的 prvalue。参见 [expr.cast]/1:
表达式
(T)
强制转换表达式的结果为T
类型。如果结果是左值引用T
则为左值 类型或对函数类型的右值引用和 x值(如果T
是对对象类型的右值引用);否则 结果是一个 PR值。[注意:如果T
是符合 cv 条件的非类类型,则在以下情况下忽略 cv 限定符 确定结果 PRVALUE 的类型;见 3.10。—尾注]
和 [basic.lval]/4:
类 prvalue 可以具有符合 cv 条件的类型;非类 prvalue 始终具有 CV 非限定类型。除非 另有说明(5.2.2),PR值应始终具有完整类型或空类型;除了这些 类型,gl值也可以具有不完整的类型。
因此,即使您将强制转换写入const int
,结果值也将具有类型int
。
但是,语言律师可能会问(int)
演员和(const int)
演员是否保证产生相同的价值。显然,在您的情况下,584
适合int
因此保证价值是584
。在一般情况下,long
值可能不适合int
,[dcl.init]/16 的最后一个项目符号点保证强制转换为const int
的结果仍将与转换为int
的结果相同:
。否则,正在初始化的对象的初始值是 ini- 的(可能转换的)值 提亚利泽表达式。如有必要,将使用标准转换(第 4 条)来转换初始值设定项 表达式到目标类型的 CV 非限定版本;
(所有措辞均来自C++14标准;重点是我的。
不,编译器不会隐式添加const
,因为它不会更改任何内容。您的两个代码段都是等效的。
我不认为标准定义了这种情况,因为它有点做作。
您的问题等效于此处是否const
a
重要(在下面的示例中)。答案是否定的,它没有,因为你正在复制a
.你不能写a
没关系,因为你只是在做读取,而不是写。
/*const*/ int a = 10;
const int b = a;
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 将值指定给向量(2D)的向量中的某个位置
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 非常量变量只读位置的赋值
- 常量引用的内存位置
- 当原始数据是常量时,修改指针指向的位置是 UB 吗?
- 非常量调用 const 成员函数失败,只读位置C++
- 指针或参照的常量位置
- 将强制转换为较窄的常量位置时是否暗示到常量?
- 使用新的位置来创建静态常量指针,指向静态内存缓冲区
- 测试静态常量成员的存储位置
- C++:I用不同的位置调用字符串 substr 两次,转换为常量字符 *,它们返回相同的,为什么
- 初始化 SSE 常量的位置
- 在c++类+ final常量中放置struct和enum的位置
- 编写JIT编译器时存储代码常量的位置
- 为什么迭代器向量::插入在填充后无效:迭代器插入(const_iterator位置,size_type n,常量value_type和val);
- 在C++中,指针和带有常量的与号位置
- 参数传递中常量位置的 c++ 标准是什么?