我试图尽可能地表达这一点,但一个例子是演示我的问题的好方法。考虑以下场景,其中变量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;