#cpp #шаблоны_с++ #mingw #mingw_w64
При компиляции с MinGW-w64 этого простого кода: #include#include #include template void readWithSep(){ std::istringstream sLine; sLine.str("hello"); std::string line; while(std::getline(sLine, line)){ std::cout< (); } выдаётся ошибка: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Werror=strict-aliasing] while(std::getline(sLine, line)){ Компилирую так: i686-w64-mingw32-g++ -std=c++17 -W -Wall -Wextra -pedantic -Werror -O3 file.cpp Почему возникает эта ошибка и как её исправить? Здесь же вроде никаких преобразований типов не происходит. Странно, что g++ это компилирует без ошибок (с теми же флагами) Полный вывод компилятора: file.cpp: В функции «void readWithSep()»: file.cpp:10:35: ошибка: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Werror=strict-aliasing] while(std::getline(sLine, line)){ cc1plus: все предупреждения считаются ошибками
Ответы
Ответ 1
Похоже, это бага (точнее регресия) в gcc. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80633 Воспроисводится только при включенном -O2/-O3, потому что на этом уровне включается -ftrict-aliasing. Если компилятор менять не получается или уровень оптимизации, то можно просто добавить -fno-strict-aliasing.
Комментариев нет:
Отправить комментарий