考虑一个示例,我想创建一个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}};
}
现在,代码停止在这些编译器中的任何一个上编译,并且出现类似以下错误:
error: invalid conversion from 'int*' to 'int' [-fpermissive] type block_types[3] = { {a1}, {a2}, {a3}}; ^
注意:此确切的错误消息来自GCC 8.1。
那是为什么?为什么bool[]
与int[]
被不同对待?这背后的原理是什么?
答案 0 :(得分:1)
首先,block_types是一个由三个布尔数组组成的数组。初始化程序中的每个内部块都需要提供一个布尔值。您已经为每个指针指定了一个指针,指针将转换为bool。
在第二个中,block_types是一个由三个整数组成的数组,一个整数,并且初始化程序的每个内部块都需要提供一个整数值。您再次指定了指针,但它们不会转换为整数。
所以,不:数组在相同的规则上衰减,但是最终的指针转换区分了示例。