MSVC 是否有针对此代码生成“内部编译器错误”的解决方法?

Is there any workaround for MSVC producing `Internal compiler error` for this code?

出于某种原因,下面的代码给了我 fatal error C1001: Internal compiler error. with MSVC 19.27, but not with Clang。知道如何编写它以便 static_assert 也可以在 MSVC 上完成吗?

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

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

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

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


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

我想在 stl 不可用的环境中使用它,所以没有它的解决方案最有趣。

正如评论所指出的,这是一个 MSVC 错误,您绝对应该向 Microsoft 报告。

通过删除多行直到编译器停止崩溃,我相信原因是 range-for 循环。因此,由于它们是已知大小的数组,您可以使用经典的索引循环解决方法:

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

    auto find = [&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;
}

It works on MSVC.