布尔阵列在衰减方面是否有所不同?

时间:2019-02-09 23:40:38

标签: c++ arrays type-conversion int boolean

考虑一个示例,我想创建一个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[]被不同对待?这背后的原理是什么?

1 个答案:

答案 0 :(得分:1)

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

在第二个中,block_types是一个由三个整数组成的数组,一个整数,并且初始化程序的每个内部块都需要提供一个整数值。您再次指定了指针,但它们不会转换为整数。

所以,不:数组在相同的规则上衰减,但是最终的指针转换区分了示例。

相关问题