考虑一个示例,我想创建一个bool数组数组:
int main() {
using type = bool[1];
bool a1[1] = {true};
bool a2[1] = {true};
bool a3[1] = {true};
type block_types[3] = {{a1}, {a2}, {a3}};
}
此代码编译为Clang 7.0.0,GCC 8.2和MSVS v19.16.
现在,让我们将bool更改为int:
int main() {
using type = int[1];
int a1[1] = {1};
int a2[1] = {1};
int a3[1] = {1};
type block_types[3] = {{a1}, {a2}, {a3}};
}
现在,代码停止编译任何这些编译器,错误类似于:
06002
注意:此确切错误消息来自GCC 8.1.
这是为什么?为什么bool []的处理方式与int [] s不同?这背后的理由是什么?
最佳答案 在第一个中,block_types是一个包含一个布尔值的三个数组的数组.初始化程序中的每个内部块都需要提供一个布尔值.你给了每个指针,指针将转换为bool.
在第二个中,block_types是一个包含一个整数的三个数组的数组,初始化程序的每个内部块都需要提供一个整数值.你再次给出指针,它们不会转换为整数.
所以,不:数组在相同的规则上衰减,但结果指针转换区分了这些例子.