msvc и выражение свертки

У меня проблемы с компиляцией этого кода в Windows.

Этот код правильно компилируется в Linux, как с clang, так и с gcc. Я использую msvc 19.29.

Выход Msvc с не очень полезной ошибкой C1001.

      struct Object{};

class Storage {
    Object &createObject() {
        qStorrage.push_back(Object{});
        return qStorrage.back();
    }

    template <class... Objs>
    void deleteObject(const Objs&...obj)
    {
        const auto e = std::remove_if(qStorrage.begin(), qStorrage.end(), [&](const auto &i) { return ((i == obj) || ...); });
        qStorrage.erase(e, qStorrage.end());
    }
}

Цель состоит в том, чтобы иметь возможность передавать множественные ссылки Object необходимо удалить, чтобы избежать многократного вызова одной и той же функции.

      Storage stor;

auto a = stor.create();
auto b = stor.create();

stor.delete(a, b);

Вы знаете, почему MSVC не может это скомпилировать?

РЕДАКТИРОВАТЬ :

Вот актуальные файлы:

https://github.com/zcorniere/logger-cpp/blob/windows/include/Logger.hpp

https://github.com/zcorniere/logger-cpp/blob/windows/example/example.cpp

сборка с cmake с включенным параметром BUILD_EXAMPLE

EDIT2: вот сообщение об ошибке msvc, извините, я забыл об этом

      message : This diagnostic occurred in the compiler generated function 'bool ProgressBar::operator ==(const ProgressBar &) const' [C:\Users\Zacharie Corniere\Documents\GitHub\logger-cpp\build\example\example.vcxproj]
[build] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\xmemory(1967): message : see reference to function template instantiation 'bool Logger::deleteProgressBar::<lambda_1>::operator ()<ProgressBar>(const _T1 &) const' being compiled [logger-cpp\build\example\example.vcxproj]
[build]           with
[build]           [
[build]               _T1=ProgressBar
[build]           ]
[build] logger-cpp\include\Logger.hpp(51): message : see reference to function template instantiation '_FwdIt std::remove_if<std::_Deque_iterator<std::_Deque_val<std::_Deque_simple_types<_Ty>>>,Logger::deleteProgressBar::<lambda_1>>(_FwdIt,const _FwdIt,_Pr)' being compiled [logger-cpp\build\example\example.vcxproj]
[build]           with
[build]           [
[build]               _FwdIt=std::_Deque_iterator<std::_Deque_val<std::_Deque_simple_types<ProgressBar>>>,
[build]               _Ty=ProgressBar,
[build]               _Pr=Logger::deleteProgressBar::<lambda_1>
[build]           ]

2 ответа

Решение

C1001 это внутренняя ошибка компилятора.

Он используется для обозначения ошибок в самом компиляторе, компилируемый код не обязательно ошибочен.

Сообщите об ICE по адресу https://developercommunity.visualstudio.com/ или через Справку> Отправить отзыв> Сообщить о проблеме ... из Visual Studio

Попробуйте уменьшить то, что именно выдает ДВС. Это поможет как составить хороший отчет об ошибках, так и избежать использования ICE в вашем коде, поскольку исправление может быть недоступно в ближайшее время.


Я сократил ваш пример:

      #include <vector>

class ProgressBar
{
public:
    std::strong_ordering operator<=>(const ProgressBar &) const = default;
};

std::vector<ProgressBar> v;

    template <class... Objs>
    void deleteObject(const Objs&...obj)
    {
        std::remove_if(v.begin(), v.end(), [&](const auto &i) { return ((i == obj) || ...); });
    }

int main()
{
    ProgressBar p;
    deleteObject(p);
} 

См. Воссозданное сообщение об ошибке: https://godbolt.org/z/dbz34PcTf

и я сообщил об этом: https://developercommunity.visualstudio.com/t/internal-compiler-error-with-fold-expression-and-d/1522072


Обходной путь

В добавление к <=> оператор добавить == оператор для ProgressBar:

          std::strong_ordering operator<=>(const ProgressBar &) const = default;
    bool operator==(const ProgressBar &) const = default;

Он не будет компилироваться, потому что deleteзарезервированное ключевое слово. Измените букву «d» на «D».

Вам также необходимо добавить точку с запятой в конце определения структуры.

И вам нужно объявить член qStorrage (например, std::vector<Object> qStorrage;).

Другие вопросы по тегам