首页 > 解决方案 > 在衰减方面是否对布尔数组进行了不同的处理?

问题描述

考虑一个例子,我想创建一个数组数组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.0GCC 8.2MSVS v19.16 编译

现在,让我们更改boolint

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[]s 的处理方式与int[]s 不同?这背后的原因是什么?

标签: c++arraystype-conversionintboolean

解决方案


首先,block_types 是一个由三个数组组成的一个布尔值数组。初始化程序中的每个内部块都需要提供一个布尔值。您已经为每个指针指定了一个指针,指针将转换为 bool。

第二种,block_types 是一个整数的三个数组的数组,你的初始化器的每个内部块都需要提供一个整数值。您再次给出了指针,它们不会转换为整数。

所以,不:数组按照相同的规则衰减,但结果指针转换区分了示例。


推荐阅读