考虑一个例子,我想创建一个 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[]
的处理方式不同?这背后的原理是什么?
最佳答案
首先,block_types 是一个包含一个 boolean 值的三个数组的数组。初始化程序中的每个内部 block 都需要提供一个 boolean 值。您已经为每一个都提供了一个指针,指针将转换为 bool。
在第二种情况下,block_types 是一个包含一个整数的三个数组的数组,您的初始化程序的每个内部 block 都需要提供一个整数值。您再次给出了指针,但它们没有转换为整数。
所以,不:数组按照相同的规则衰减,但是产生的指针转换将这些示例区分开来。
关于c++ - bool 数组在衰减方面的处理方式不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54611951/