c++ - bool 数组在衰减方面的处理方式不同吗?

标签 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.0GCC 8.2MSVS 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/

相关文章:

java - 如何在 JNA 中使用 C++ 对象

types - 表达 Redis 时间复杂度

c++ - 频谱图 C++ 库

c++ - 字符数组 c((SIGSEGV)(核心转储))

arrays - Excel VBA 多选并将工作簿设置为变量

java - 使用 Java 的数组的 printMax 方法...我不明白的一件事是 double result = Numbers[0]

c - 使用指针了解数组的大小

c# - 无法将日期字符串转换为 DateTime

c++ - 列为类(class)成员

c++ - 可以在 C++ 内存模型中合并原子负载吗?