c – bool阵列在衰变方面的处理方式是否不同?

考虑一个示例,我想创建一个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是一个包含一个整数的三个数组的数组,初始化程序的每个内部块都需要提供一个整数值.你再次给出指针,它们不会转换为整数.

所以,不:数组在相同的规则上衰减,但结果指针转换区分了这些例子.

点赞