Есть ли какой-либо обходной путь для MSVC, создающий `внутреннюю ошибку компилятора` для этого кода?

#c #visual-c #lambda #c 17 #constexpr

#c #visual-c #лямбда #c 17 #constexpr

Вопрос:

По какой-то причине приведенный ниже код выдает меня fatal error C1001: Internal compiler error. с MSVC 19.27, но не с Clang. Есть идеи, как написать это так, чтобы это static_assert можно было сделать и на MSVC?

 template <typename T, int N, typename K, int M>
constexpr int countIdentifersNotInArray(const T(amp;identifiers)[N], const K(amp;array)[M]) {

 auto find = [amp;array](const unsigned char value) {
        for (const autoamp; a : array) {
            if (a == value) {
                return true;
            }
        }
        return false;
    };

    int count = 0;
    for (const autoamp; value : identifiers) {
        if (!find(value)) {
              count;
        }
    }
    return count;
}

constexpr bool testIt() {
    return countIdentifersNotInArray({ 0x01, 0x02 }, { 0x01 });
}


int main() {
    static_assert(testIt());
    return 0;
}
  

Я хотел бы использовать это в среде, где stl недоступен, поэтому решения без этого наиболее интересны.

Комментарии:

1. Вы обязательно должны сообщить об этом MS.

2. Я сообщил о проблеме.

Ответ №1:

Как указано в комментарии, это ошибка MSVC, и вам обязательно следует сообщить об этом в Microsoft.

Я полагаю, что причиной является цикл range-for, удаляя несколько строк до тех пор, пока он не прекратит сбой компилятора. Итак, поскольку это массивы с известным размером, вы можете обойти их с помощью классических индексированных циклов:

 template <typename T, int N, typename K, int M>
constexpr int countIdentifersNotInArray(const T(amp;identifiers)[N], const K(amp;array)[M]) {

    auto find = [amp;array](const auto value) {
        for (int i = 0; i < M; i  ) {
            if (array[i] == value) {
                return true;
            }
        }
        return false;
    };

    int count = 0;
    for (int i = 0; i < N; i  ) {
        if (!find(identifiers[i])) {
              count;
        }
    }
    return count;
}
  

Он работает на MSVC.