Комитет ISO утвердил спецификацию С++17

C++17

Комитет ISO по языку C++ единогласно утвердил спецификацию C++17. Теперь она формально является международным стандартом. Новые возможности уже есть в компиляторах GCC и clang, а также частично присутствуют в Intel C++ и Visual C++.

Работа над стандартом была завершена ещё в марте этого года. С тех пор происходила формальная процедура подтверждения, было внесено небольшое количество изменений. В результате голосования комиссии работа получила 23 замечания, все они не технического характера.

В течение следующих двух месяцев будет проходить подготовка документа к публикации, где будут исправлены все опечатки и ошибки. В начале ноября окончательный вариант документа будет направлен в ISO для публикации под формальным именем ISO/IEC 14882:2017. Комитет уже начал работу над следующим стандартом C++20.

Основные изменения в C++17

  • Возможность инициализации переменных внутри выражений if и switch;
  • Возможность использования кодировки UTF-8 в символьных литералах;
  • Шестнадцатеричные литералы с плавающей запятой;
  • Указание текстового сообщения в static_assert теперь опционально;
  • Удалена поддержка триграфов;
  • Возможность указания typename (как альтернативы классам) в параметрах вложенного шаблона;
  • Новые правила вывода типа auto из списка инициализации (braced-init-list);
  • Возможность упрощённого определения вложенных параметров пространств имён: namespace X::Y {...} вместо namespace X { namespace Y {...}};
  • Возможность указания атрибутов для пространств имён и перечислений;
  • Новые стандартные атрибуты [[fallthrough]], [[maybe_unused]] и [[nodiscard]];
  • Проверка на неизменность (константность) для всех нетипизированных аргументов шаблонов;
  • Сворачивание выражений для вариативных шаблонов;
  • Раскрытие выражений if на стадии компиляции, если заданное внутри условие является константой;
  • Структурированные привязки, например, auto [a, b] = getTwoReturnValues();
  • Автоматическое определение типов конструктора шаблонов (например, теперь можно указывать std::pair(5.0, false), явно не задавая типы double, bool);
  • Inline-переменные, которые можно определять в заголовочных файлах;
  • Добавлена библиотека для работы с ФС, основанная на boost::filesystem;
  • Из библиотеки TS I перенесены std::string_view, std::optional и std::any;
  • Добавлен std::uncaught_exceptions в качестве замены std::uncaught_exception;
  • Новые функции вставки try_emplace и insert_or_assign для std::map и std::unordered_map;
  • Унифицирован доступ к контейнерам std::size, std::empty и std::data;
  • Определены непрерывные итераторы (continuous iterators);
  • Удалены устаревшие типы и функции, в том числе std::auto_ptr и std::random_shuffle;
  • Представлены параллельно выполняемые варианты алгоритмов STL;
  • Добавлены дополнительные математические функции, включая эллиптические интегралы и функции Бесселя;
  • Представлены std::variant и std::byte;
  • Новые свойства логического оператора: std::conjunction, std::disjunction и std::negation.

Источник: Sutter's Mill