#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;
}