Стандарт языка c 17

Стандарт языка c 17

    Новости, 23 марта 2017 в 20:31

В начале марта в городе Кона, Гавайи, завершилась встреча международной группы WG21 по стандартизации C++. Основное время было посвящено обработке черновика С++17, но также было добавлено несколько интересных нововведений:

И 20 лет не прошло

std::optional и сравнения

Раньше операторы сравнения для класса std::optional выглядели так:

Что могло приводить к ошибкам компиляции:

Сейчас же проблема решена:

Теперь все перечисленные примеры будут компилироваться, а сравнение s == «Hello» будет работать без создания временного объекта строки.

Deduction guides

Следующий код теперь будет собираться:

std::array также добавили в explicit deduction guides.

std::byte

В С++17 появится тип данных std::byte . Теперь вместо этого:

можно писать это:

С остальными нововведениями можно ознакомиться на сайте российской рабочей группы по C++.

История стандартов языка C++

Важную роль в развитии языка C++ играют стандарты языка. Хотя язык C++ разрабатывался с 1980-х годов, первый стандарт языка C++98 был окончательно утвержден только в 1998 году.

В 2003 году был издан стандарт С++03, являющийся уточнением стандарта C++98.

Наиболее существенные изменения языка произошли в стандарте C++11, разработка которого завершилась в 2011 году. Далее будут изложен ряд нововведений стандарта C++11.

В 2014 году был издан стандарт С++14, не содержащий существенных изменений, а только устраняющий ряд дефектов стандарта С++11.

Разработка следующего стандарта C++17 будет завершена в 2017 году. Этот стандарт также содержит ряд интересных нововведений, однако их не столь много, как в стандарте С++11.

Ссылки:

Auto-тип переменной

При работе с контейнерами STL иногда приходится писать конструкции вида

map >::reverse_iterator it;

То есть описание типа может быть очень длинной строкой. Вместо этого в C++11 можно объявить имя типа, как auto , что означает, что компилятор должен сам определить тип переменной. В этом случае переменная должна быть явно инициализирована при объявлении, например:

auto it = a.begin();

В этом случае компилятор знает тип значения a , поэтому он может определить тип, который возвращает метод begin() , и тем самым будет определен тип переменной it .

Самый простой вариант (можно использовать для определения того, включена ли поддержка C++11):

В этом случае переменная a будет иметь тип int . Если написать:

то переменная a будет иметь тип double .

Обратите внимание, это НЕ динамическая типизация! Переменная по-прежнему имеет строго определенный тип, который не может быть впоследствии изменен! Но этот тип программист просто не указывает явно для облегчения труда.

range-based циклы

В C++11 появились range-based циклы: циклы, в которых переменная пробегает по всем значением контейнера. Контейнер должен поддерживать методы begin() и end() — это может быть vector , list , set , map .

Пример такого цикла для вывода элементов вектора:

vector a;
for (int elem: a)
cout auto .

Таким образом можно модифицировать элементы вектора, если сделать цикл по переменной-ссылке, а не по переменной-значению:

Если цикл пробегает по элементам контейнера map, то переменная будет парой из двух элементов: ключ и значение. То есть:

map a;
for (auto & elem: a)
<
// a.first — ключ элемента словаря, a.second — его значение
>

Универсальная инициализация

В языке C элементы массива можно инициализировать списком значений, например, так:

В С++11 такая универсальная инициализация распространена на структуры и классы. В списке инициализации в фигурных скобках необходимо указать значения полей структуры в том порядке, в котором они объявлены. Например,

В этом случае P.x будет равно 1, P.y будет 2.

Читайте также:  Подсчет среднего возраста сотрудников

Еще один способ использования универсальной инициализации:

Поскольку pair является структурой, то этот способ можно использовать для инициализации pair . Например, если функция возвращает значение типа pair , то можно написать:

Шаблоны с переменным числом аргументов и std::tuple

В C++11 появилась возможность создания шаблонов с переменным числом аргументов. Один из примеров такого шаблона — tuple, определенный в одноименном заголовочном файле. Это кортеж, то есть переменная, которая содержит несколько полей различных типов.

Доступ к составным полям tuple осуществляется при помощи функции-шаблона get с одним числовым параметром — номер поля, к которому производится доступ. Например:

get (person) = "Peter";
get (person) = "Ivanov";
get (person) = 16;

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

Объекты класса tuple сравниваются в лексикографическом порядке, поэтому их удобно использовать при сортировке векторов вместо pair, если нужно сортировать по нескольким параметрам.

Структура tie

tie является структурой, определенной в заголовочном файле tuple . Структура tie похожа на tuple , только членами структуры являются ссылки на какие-либо переменные (или прочие lvalue, например, элементы массива и т.д.). Это позволяет модифицировать переменные, переданные в качестве параметров при создании tie.

Пример. Пусть функция f возвращает пару значений, то есть структуру pair или tuple. Хочется записать эти значения в две переменные. Раньше мы писали так:

auto res = f();
a = res.first;
b = res.second;

С использованием tie это можно сделать так:

Лямбда-функции

Лямбда-функции — это безымянные функции, которые не получают собственного имени, а используются только в месте объявления.

Распространенное использование лямбда-функций — это параметр-компаратор при сортировке. Вместо создания специальной функции-компаратора, можно описать функцию прямо в вызове функции sort.

Пример — отсортируем vector a по последней цифре числа:

То есть NULL является значением типа int , что может привести к проблемам сравнения указателя с целым числом. В стандарте C++11 для обозначения нулевого указателя появилось новое специальное значение nullptr .

Угловые скобки во вложенных шаблонах

При определении вложенных шаблонов, например:

в C++11 можно не ставить пробел между " long long int , который раньше был расширением GNU C++.

Кроме того, появились типы данных фиксированного размера, например, "32-битное целое число", они определены в заголовочном файле cstdint.

Стандартная библиотека

Много изменений произошло в стандартной библиотеке. Например, появились хеш-таблицы unordered_set и unordered_map. Появились усовершенствованные генераторы случайных чисел и поддержка регулярных выражений.

Включите поддерживаемые возможности языка C++ из указанной версии стандарта языка C++. Enable supported C++ language features from the specified version of the C++ language standard.

Синтаксис Syntax

Заметки Remarks

Параметр /std доступен в Visual Studio 2017 и более поздних версий. The /std option is available in Visual Studio 2017 and later. Он позволяет управлять тем, возможности какой версии языка программирования C++ в соответствии со стандартом ISO включены во время компиляции кода. It is used to control the version-specific ISO C++ programming language standard features enabled during compilation of your code. С помощью этого параметра можно отключать поддержку новых функций и библиотек, которые могут нарушить работу существующего кода, созданного в соответствии с определенной версией стандарта языка. This option allows you to disable support for certain new language and library features that may break your existing code that conforms to a particular version of the language standard. По умолчанию используется значение /std:c++14, которое отключает возможности языка и стандартных библиотек из последних версий языка C++. By default, /std:c++14 is specified, which disables language and standard library features found in later versions of the C++ language standard. Чтобы включить возможности и особенности стандарт C++17, используйте значение /std:c++17. Use /std:c++17 to enable C++17 standard-specific features and behavior. Чтобы явным образом включить реализованные возможности компилятора и стандартной библиотеки, предлагаемые для следующего проекта стандарта, используйте значение /std:c++latest. To explicitly enable the currently implemented compiler and standard library features proposed for the next draft standard, use /std:c++latest. Для всех функций C++ 20 требуется /std: C + + Latest; После завершения реализации будет включен новый параметр /std: c++ 20 . All C++20 features require /std:c++latest; when the implementation is complete, a new /std:c++20 option will be enabled.

Читайте также:  Как установить друг вокруг на телефон

Параметр по умолчанию /std:c++14 включает набор функций C++14, который реализован в компиляторе MSVC. The default /std:c++14 option enables the set of C++14 features implemented by the MSVC compiler. Этот параметр отключает компилятор и поддержку стандартной библиотеки для измененных и новых функций в более поздних версиях стандарта языка, за исключением некоторых функций C++17, уже реализованных в предыдущих выпусках компилятора MSVC. This option disables compiler and standard library support for features that are changed or new in more recent versions of the language standard, with the exception of some C++17 features already implemented in previous releases of the MSVC compiler. Во избежание критических изменений для пользователей, которые уже применяют функции, доступные начиная с Visual Studio 2015 с обновлением 2, следующие функции остаются включенными при указании параметра /std:c++14: To avoid breaking changes for users who have already taken dependencies on the features available as of Visual Studio 2015 Update 2, these features remain enabled when the /std:c++14 option is specified:

Дополнительные сведения о том, какие функции C++ 14 и C++ 17 включены при указании /std: c++ 14 , см. в разделе Примечания в таблице соответствия языков Майкрософт C++ . For additional information on which C++14 and C++17 features are enabled when /std:c++14 is specified, see the notes in Microsoft C++ language conformance table.

Параметр /std:c++17 включает полный набор функций C++17, который реализован в компиляторе MSVC. The /std:c++17 option enables the full set of C++17 features implemented by the MSVC compiler. Этот параметр отключает компилятор и поддержку стандартной библиотеки для измененных и новых функций в более поздних версиях рабочего проекта и исключает обновления C++ Standard после выхода C++17. This option disables compiler and standard library support for features that are changed or new in versions of the Working Draft and defect updates of the C++ Standard after C++17.

Параметр /std:c++latest включает возможности языка и библиотеки, появившиеся после версии C++17 и реализованные в настоящее время в компиляторе и библиотеках. The /std:c++latest option enables the post-C++17 language and library features currently implemented in the compiler and libraries. К ним могут относиться возможности из рабочего проекта C++20 и недействительные обновления стандарта C++, не включенные в C++17, а также экспериментальные предложения для проекта стандарта. These may include features from the C++20 Working Draft and defect updates of the C++ Standard that are not included in C++17, as well as experimental proposals for the draft standard. Список поддерживаемых возможностей языка и библиотек см. в статье Новые возможности Visual C++. For a list of supported language and library features, see What’s New for Visual C++. Параметр /std:c++latest не включает возможности, защищенные с помощью параметра /experimental, но может требоваться для их включения. The /std:c++latest option does not enable features guarded by the /experimental switch, but may be required to enable them.

Читайте также:  Нормальная частота процессора для ноутбука

Возможности компилятора и библиотек, включаемые параметром /std:c++latest, — это возможности, которые могут появиться в будущем стандарте C++, а также утвержденные возможности C++20. The compiler and library features enabled by /std:c++latest represent features that may appear in a future C++ standard, as well as C++20 features that are approved. Неутвержденные возможности предоставляются на условиях "как есть", могут удаляться без уведомления либо в них могут вноситься критические изменения. Features that have not been approved are subject to breaking changes or removal without notice and are provided on an as-is basis.

Параметр /std, действующий во время компиляции кода C++, можно обнаружить с помощью макроса препроцессора _MSVC_LANG. The /std option in effect during a C++ compilation can be detected by use of the _MSVC_LANG preprocessor macro. Дополнительные сведения см. в статье Макросы препроцессора. For more information, see Preprocessor Macros.

Параметры /std:c++14 и /std:c++latest доступны начиная с Visual Studio 2015 с обновлением 3. The /std:c++14 and /std:c++latest options are available beginning in Visual Studio 2015 Update 3. Параметр /std:c++17 доступен начиная с версии 15.3 Visual Studio 2017. The /std:c++17 option is available beginning in Visual Studio 2017 version 15.3. Как отмечалось выше, некоторые стандартные возможности C++17 включаются параметром /std:c++14, а остальные — параметром /std:c++17. As noted above, some C++17 standard behavior is enabled by the /std:c++14 option, but all other C++17 features are enabled by /std:c++17. Пока реализация стандарта C++20 не завершена, его возможности включаются параметром /std:latest. C++20 features are enabled by /std:latest until the implementation is complete.

В зависимости от версии или уровня обновления компилятора MSVC возможности C++17 при указании параметра /std:c++17 могут быть реализованы не полностью. Depending on the MSVC compiler version or update level, C++17 features may not be fully implemented or fully conformant when you specify the /std:c++17 options. Общие сведения о согласовании C++ языка в Visual C++ по версии выпуска см. в разделе Таблица C++ соответствия языков Майкрософт. For an overview of C++ language conformance in Visual C++ by release version, see Microsoft C++ language conformance table.

Установка данного параметра компилятора в среде разработки Visual Studio To set this compiler option in the Visual Studio development environment

Откройте диалоговое окно Страницы свойств проекта. Open the project’s Property Pages dialog box. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio. For details, see Set C++ compiler and build properties in Visual Studio.

Выберите Свойства конфигурации, C/C++ , Язык. Select Configuration Properties, C/C++, Language.

В разделе Стандарт языка C++ выберите стандарт языка, который должен поддерживаться, в раскрывающемся списке, а затем нажмите кнопку ОК или Применить, чтобы сохранить изменения. In C++ Language Standard, choose the language standard to support from the dropdown control, then choose OK or Apply to save your changes.

Ссылка на основную публикацию
Создать новую электронную почту на яндексе бесплатно
Всем привет! С вами снова я, Алексей. В этом посте я расскажу вам о том, как создать электронную почту на...
Сколько человек сидит в одноклассниках
Mail.Ru Group исследовала и сравнила аудитории самых популярных в России социальных сетей — «Одноклассники», «Мой Мир», «ВКонтакте», Facebook и Twitter....
Сколько четырехзначных чисел можно составить из нечетных
Условие Решение 1 Решение 2 Решение 3 Поиск в решебнике Популярные решебники Издатель: Н. Я. Виленкин, В. И. Жохов, А....
Создать канал на ютубе регистрация бесплатно
Добрый день, уважаемые читатели и гости моего блога! Если вы попали на эту статью, значит хотите узнать, как зарегистрироваться в...
Adblock detector