阅读 JAVA 13 SE 规范,我在第 5 章第 5.1.7 节中找到。拳击转换以下保证:
如果被装箱的值 p 是对 boolean、char、short、int 或 long 类型的常量表达式(第 15.28 节)求值的结果,并且结果为 true、false,则为 '\u0000' 到 ' 范围内的字符\u007f'(含),或 -128 到 127(含)范围内的整数,然后让 a 和 b 是 p 的任意两次装箱转换的结果。a == b 总是这样
我觉得奇怪的是,字节类型的值被排除在该措辞之外。
例如,在如下代码中:
Byte b1=(byte)4;
Byte b2=(byte)4;
System.out.println(b1==b2);
Run Code Online (Sandbox Code Playgroud)
我们有一个byte类型的常量表达式,装箱后b1和b2的值可能是也可能不是同一个对象。
在没有演员的情况下,它实际上以相同的方式工作:
Byte b1=4;
Run Code Online (Sandbox Code Playgroud)
在这里,我们在赋值上下文中有一个 int 类型的常量表达式。所以,根据规范
如果变量的类型为 Byte、Short 或 Character,并且常量表达式的值可分别以 byte、short 或 char 类型表示,则可以使用缩窄原语转换后跟装箱转换。
因此表达式将被转换为字节,并且该字节类型的值将被装箱,因此不能保证该值是实习的。
我的问题是我对规范的解释是否正确,还是我遗漏了什么?我查看了规范是否需要使用 Byte.valueOf() 方法进行装箱(为此可以保证),但事实并非如此。
我正在研究 C++ 中的初始化语法,根据cppreference,有三种可能的编写方式,1)括号,2)等号,3)大括号。
尝试使用 1) 括号语法初始化数组时,遇到错误。
int test() {
int a[](1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在 Compiler Explorer 上测试,我从 clang 11.0.0 获得
error: array initializer must be an initializer list
int a[](1);
^
Run Code Online (Sandbox Code Playgroud)
同样,在与 gcc 10.2 相同的站点上
error: array must be initialized with a brace-enclosed initializer
Run Code Online (Sandbox Code Playgroud)
现在,我知道如何使用大括号来初始化数组而不会出错。但这不是这个问题的重点。
我正在寻找与此报告的错误对应的 C++ 标准。
我正在查看这个标准草案timsong-cpp(应该在 C++ 20 时代左右)。“(17.1) If the initializer is a (non-parenthesized) brad-init-list or is =braced-init-list, ...”一节讨论了花括号列表——不是我们的情况。
然后有一段“(17.5)否则,如果目标类型是数组,则对象初始化如下……”
我认为这应该涵盖我们的情况。它是关于数组的初始化,它也是一个“其他”部分,这意味着它不会谈论花括号列表。它可以谈论 1) 括号或 2) 等号,但从进一步的文本中我们看到它需要一个表达式列表:
“让 x1, ..., xk 是表达式列表的元素。”
使用 …