将强制转换为较窄的常量位置时是否暗示到常量?

Is casting to const implied when casting to a narrower const location?

本文关键字:常量 位置 是否 暗示 转换      更新时间:2023-10-16

我试图尽可能地表达这一点,但一个例子是演示我的问题的好方法。考虑以下场景,其中变量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,因为它不会更改任何内容。您的两个代码段都是等效的。

我不认为标准定义了这种情况,因为它有点做作。

您的问题等效于此处是否consta重要(在下面的示例中)。答案是否定的,它没有,因为你正在复制a.你不能写a没关系,因为你只是在做读取,而不是写。

/*const*/ int a = 10;
const int b = a;