Здравствуйте, nullptr_rs, Вы писали:
C>>И в godbolt, и в webcompiler я использовал ключ /permissive-. В первом случае предупреждение еще выдается, во втором — уже нет. Попробуйте и у себя этот ключ на всякий случай.
_>Отдельный ключ для более полного соответствия стандарту? Забавно, но проблему, похоже, решает. Спасибо
Это "новый" ключ. Причем он пока даже не добавлен в визуальный интерфейс (настройки проекта). Есть еще "старый" ключ
/Za.
Вообще, на тропу войны с современным
Visual C++ (имеется в виду
Visual Studio 2017 и ее update'ы) я бы не выходил без чего-то вроде следующего:
/std — Specify Language Standard Version (на выбор по вкусу):
/std:c++14
/std:c++17
/std:c++latest
/Za — Disable language extensions (отключает некоторые расширения компилятора Visual C++ [довольно ограниченное количество], не соответствующие стандарту языка);
/Zc — Conformance (флаги этого семейства приводят в соответствие со стандартом отдельные аспекты компиляции C++ кода [флаги, которые включены по умолчанию, я не упоминаю]):
/Zc:externConstexpr — Enable extern constexpr variables (начиная с Visual Studio 2017 Update 15.5);
/Zc:inline — Remove unreferenced COMDAT (по стандарту тело inline-функции должно быть определено в той же единице трансляции, где она используется);
/Zc:referenceBinding — Enforce reference binding rules (запрещает привязывание временных объектов к неконстантным ссылкам [неявно включается /permissive-]);
/Zc:rvalueCast — Enforce type conversion rules;
/Zc:strictStrings — Disable string literal type conversion (указывать на строковый литерал могут только указатели на константу);
/Zc:throwingNew — Assume operator new throws;
/permissive- — ISO C++ Conformance (приблизительный аналог флага -pedantic в clang++ и g++);
Предупреждения компилятора:
/Wall — выкручиваем уровень предупреждений на максимум (соответствует 4-му уровню предупреждений с некоторыми дополнительными предупреждениями, которые отключены по умолчанию);
/WX — превращаем все предупреждения в ошибки компиляции;
/wd — отключаем некоторые наиболее бесполезные и бессмысленные предупреждения, задавая их номера (по вкусу):
/wd"4514" — 'function' : unreferenced inline function has been removed;
/wd"4710" — 'function' : function not inlined;
/wd"4711" — function 'function' selected for inline expansion;
/wd"4820" — 'bytes' bytes padding added after construct 'member_name';
/wd"4868" — 'file(line_number)' compiler may not enforce left-to-right evaluation order in braced initializer list;
/D "_STL_WARNING_LEVEL=3" — запрещаем применять к заголовочным файлам стандартной библиотеки предупреждения выше 3-го уровня (чтобы связка ключей /Wall /WX не нападала на них; к сожалению, заголовочные файлы стандартной библиотеки, поставляемой вместе с Visual C++, по-прежнему выдают огромное число предупреждений, если задать /W4 или /Wall, но с 3-м уровнем предупреждений товарищи из Microsoft вроде бы справились);
/EHsc — Exception Handling Model (приводим используемую модель обработки исключений в соответствие с требованиями стандарта);
/sdl — Enable Additional Security Checks.
_>В общем-то найти workaround не проблема. Но баги кодогенератора печалят
В компиляторе от
Microsoft до сих пор такое количество багов, что это должно не печалить, а веселить. Впрочем, в
clang++ и
g++ багов тоже предостаточно.