Почему я не могу использовать decltype в range-for с многомерными массивами? - PullRequest
0 голосов
/ 23 февраля 2019

У меня проблема здесь.Я пытаюсь использовать decltype в range-for цикле для использования многомерного массива:

    int a[][4]{
    {0, 1, 2, 3 },
    {4, 5, 6, 7 },
    {8, 9, 10, 11}
};

for (auto& row : a) { // reference is needed here to prevent array decay to pointer
    cout << "{";
    for (auto col : row)
        cout << col << ", ";
    cout << "}" << endl;
}


decltype (*a) row{ *a};
cout << sizeof(row) << endl;
cout << typeid(row).name() << endl;

//  for (decltype(*a) row : *a) {
//      for (int col : row)
//          cout << col << ", ";
//      cout << endl;
//  }

С auto Я могу легко перебрать массив, но с decltype это неработать для меня.

Что я получу выше, если я раскомментирую код: cannot convert from int to int(&)[4].

1 Ответ

0 голосов
/ 23 февраля 2019

Это потому, что строка for(decltype(*a) row : *a) неверна.Попробуйте прочитать его правильно: для каждого массива 4 int из a, а не из * a.

Код может выглядеть следующим образом:

for (decltype(*a) row : a) {
    for (int col : row)
        cout << col << ", ";
    cout << endl;
}
  • Разыменование (* a) с помощью decltype даст массив из 4 целых чисел.Таким образом, тип int[4].В отличие от использования ключевого слова auto, где оно дает int*.
...