14.5 C
София

Официално бе утвърден стандартът C++20

Най-четени

Даниел Десподовhttps://www.kaldata.com/
Ежедневен автор на новини. Увличам се от съвременни технологии, оръжие, информационна безопасност, спорт, наука и концепцията Internet of Things.

Организацията ISO по стандартизацията на езика за програмиране C++ утвърди международния стандарт C++20. Представените в спецификациите възможности, с изключение на някои единични случаи, се поддържат в стандартните компилатори  GCCClang и Microsoft Visual C++. Поддържащите C++20 програмни библиотеки са реализирани в рамките на проекта Boost.

През следващите два месеца утвърдената вече спецификация ще премине към стадия за подготвяне на официалната документация, а в края на месец ноември тази година крайният вариант на тази документация ще бъде публикуван под името ISO/IEC 14882:2020. В същото време ISO вече започна работата върху следващия стандарт C++23 (C++2b), новите моменти в който се очаква да бъдат съобщени след около един месец.

Няколко примера на сорс код, показващи особеностите на C++20
  • Добавени са ‘концепции’ – разширения на шаблоните даващи възможност за определянето на комплект от параметри на шаблона, които по време на компилацията ограничават набора от аргументи, можещи да бъдат параметри на шаблона. Концепциите могат да се използват, за да се избегнат логическите несъответствия между свойствата на типовете данни, използвани в шаблона и свойствата на типовете входни данни
   template<typename T>
   concept EqualityComparable = requires(T a, T b) {
       { a == b } -> std::boolean;
       { a != b } -> std::boolean;
   };
  • В новия стандарт са приети разширения за работа с модули, които могат да се използват като заглавни файлове. Модулите са нов начин за организиране на сорс кодовете чрез определяне границите на компонентите, без да се налага вмъкването на файлове с помощта на ‘#include’
  • Въведен е макросът __VA_OPT__ за адаптивно разкриване вариантите на макросите в зависимост от наличието на токени
  • Поддържа се операторът ‘<=>’ за тристранно сравнение
  • По подразбиране се поддържа инициализация на елементите за битовите полета
  • Възможност за ламбда прихващане на изразите ‘*this’
   struct int_value {
     int n = 0;
     auto getter_fn() {
       // BAD:
       // return [=]() { return n; };

       // GOOD:
       return [=, *this]() { return n; };
     }
   };
  • Обръщения към елементи по указател (Pointer-to-member) чрез използването на определените с израза ‘const &’ указатели към временни обекти
  • Операторът delete с деструктор, описан в документа P0722R1
  • На класовете е разрешено да използват параметри на шаблона без тип
struct foo {
     foo() = default;
     constexpr foo(int) {}
   };

   template <foo f>
   auto get_foo() {
     return f;  
   }

   get_foo(); // uses implicit constructor
   get_foo<foo{123}>();
  • Дадена възможност за използването на низове в параметрите на шаблона
  • Поддържа се синтаксиса за инициализация в стил езика С
struct A {
     int x;
     int y;
     int z = 123;
   };

   A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2
  • Поддържат се празни членове в структурите от данни
  • Дадена е възможност за използване на диапазони за инициализация на променливите в цикъла ‘for’
   for (auto v = std::vector{1, 2, 3}; auto& e : v) {
  • Намален е броят на ситуациите, в които се налага указването на ‘typename’ за информиране наличието на тип. И други.
Абонирай се
Извести ме за
guest
4 Коментара
стари
нови
Отзиви
Всички коментари

Нови ревюта

Подобни новини