1

I was working on this answer and wrote the code:

bool generate(vector<int>& temp, int& target, const size_t width, const size_t i) {
    const auto replacement = temp[i];
    const auto result = target > replacement;

    if (result) {
        for_each(begin(temp), next(begin(temp), min(temp.size(), i + width - 1)), [=](auto& it) {
            if (target == it) {
                it = replacement;
            } else if (target < it) {
                --it;
            } });
    }
    target = replacement;
    return result;
}

int main() {
    const vector<char> rooms = { 0b1101,    0b110,  0b1101, 0b110,  0b1100, 0b101,  0b110,
                                 0b1110,    0b1001, 0b110,  0b1011, 0b1010, 0b1111, 0b1010,
                                 0b1000,    0b101,  0b11,   0b1110, 0b1011, 0b1110, 0b1010,
                                 0b1011,    0b1101, 0b101,  0b1,    0b101,  0b11,   0b1011 };
    const size_t width = 7U;
    auto result = 0;
    vector<int> temp(rooms.size());

    for (size_t i = 0U; i < rooms.size(); ++i) {
        const auto toWest = (rooms[i] & 0b1000) == 0;
        const auto toNorth = (rooms[i] & 0b100) == 0;
        const auto toEast = (rooms[i] & 0b10) == 0;
        const auto toSouth = (rooms[i] & 0b1) == 0;
        const auto west = toWest && temp[i - 1] != 0 ? temp[i - 1] : numeric_limits<int>::max();
        const auto north = toNorth && temp[i - width] != 0 ? temp[i - width] : numeric_limits<int>::max();
        const auto east = toEast && temp[i + 1] != 0 ? temp[i + 1] : numeric_limits<int>::max();

        temp[i] = min({ temp[i] != 0 ? temp[i] : numeric_limits<int>::max(), result + 1, west, north, east });

        if (temp[i] == result + 1) ++result;

        if (toWest) result -= generate(temp, temp[i - 1], width, i);
        if (toNorth) result -= generate(temp, temp[i - width], width, i);
        if (toEast) result -= generate(temp, temp[i + 1], width, i);
        if (toSouth) temp[i + width] = temp[i];
    }

    for (auto it = cbegin(temp); it != cend(temp);) {
        for (auto i = 0; i < width; ++i, ++it) cout << *it << '\t';
        cout << endl;
    }

    cout << endl << result << endl;
}

When compiled on gcc this code gives the error:

Internal compiler error: Segmentation fault it = replacement;

I've tried it locally on gcc 5.1, 5.2, and 5.3 it gives the same compiler error on all of them. Clang seems happy with the code as well as Visual Studio. This is just a compiler bug and not a mistake I've made, right?

4

1 回答 1

1

在 lambda 中按值捕获常量变量以及由于分段错误导致的后续内部编译器错误是 gcc 5.1 - 5.3 中的错误: https ://gcc.gnu.org/bugzilla/show_bug.cgi?id=70691

如果您需要修复此错误的云编译器,您可以在http://coliru.stacked-crooked.com上使用 gcc,因为它使用的 gcc 6.1已经解决了该问题

gcc 5.4 也应该对此进行更正:https
://gcc.gnu.org/bugzilla/show_bug.cgi?id=70691#c5 它于 16 年 6 月 3 日发布:https ://gcc.gnu.org/gcc- 5/

于 2016-06-17T13:41:42.587 回答