По-разному ли обрабатываются массивы bool с точки зрения распада? - PullRequest
0 голосов
/ 10 февраля 2019

Рассмотрим пример, в котором я хочу создать массив массивов 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 голосов
/ 10 февраля 2019

Во-первых, block_types - это массив из трех массивов одного логического значения.Каждый из внутренних блоков в вашем инициализаторе должен предоставлять логическое значение.Вы дали указатель для каждого из них, и указатели преобразуются в bool.

Во втором блоке block_types представляет собой массив из трех массивов одного целого числа, и каждый внутренний блок вашего инициализатора должен предоставить целое числозначение.Вы снова задали указатели, и они не преобразуются в целое число.

Итак, нет: массивы затухают по тем же правилам, но полученные преобразования указателей различают примеры.

...