1 Востаннє редагувалося LoganRoss (03.06.2017 22:17:46)

Тема: C++17

Оригінал

Міжнародна група по стандартизації С++ вирішила передати (швидше всього вже передали, так як пройшло вже більше двох місяців з часу засідання) чорновик по стандарту С++17, який може стати новим стандартом.

Базуючись на оригіналі (посилання на початку), я вирішив перекласти та викласти основні і, на мою думку, найбільш важливі моменти з цього приводу.

1. Можливість відкривати файли з юнікодними іменами.

std::ofstream(L"Файл з юнікодним іменем.txt") << u8"Корисна штука.";

2. Опис операторів порівняння для класу std::optional змінено і тепер не потрібно створювати тимчасові об'єкти для порівняння з об'єктом класа std::optional.

Детальніше про std::optional і порівняння
Оператори порівняння для класу std::optional мали вигляд:

template <class T>
bool operator < (const optional<T>&, const T&);
// ...

і це викликало помилку компіляції в таких випадках

optional<const int> x = 42;
int y = 666;
x == y; // не компілюється (error)
...

optional<string> s = "Hello";
s == "Hello"; // не компілюється (error)

В С++17 ця проблема вирішена і оператори порівняння для std::optional мають такий опис:

template <class T, class U>
bool operator < (const optional<T>&, const U&);
// ...

І наступний код скомпілюється:

optional<string> s = "Hello";
s == "Hello"; // компілюється

3. Добавилось багато явних deduction guides, що відкидає необхіднсть написання шаблонних параметрів.

Детальніше про deduction guides
Тепер наступний код компілюватиметься:

std::tuple      a {42, "Hello", 3.14};
std::array      b {1, 2, 3, 4, 5, 6, 7, 8};
std::pair       c {42, "Hello"};
std::function   d [](int i) { std::cout << i; };
std::set        e {1, 2, 3, 4, 5, 6, 7, 8};

4. Додання std::byte як заміна unsigned char. Тепер можна писати

std::byte raw_buffer[buffer_size];

замість

unsigned char raw_buffer[buffer_size];

5. std::filesystem::path було відредаговано для можливості використання цієї функції на інших платформах, а не тільки на Windows і POSIX
6. Для std::filesystem::directory_entry достатьно робити один системний виклик замість двох завдяки можливості кешування отриманих даних від ОС.
7. Для більшості випадків і при умові що викорисовуються unordered_* контейнери, std::hash має мітку noexcept, що дозволяє отримувати менший розмір бінарника.
8. Перероблені описи функцій std::atomic_* і наступний код працюватиме:

long example(atomic<long> * a) 
{ 
      return atomic_fetch_add(a, 42); 
}

9. Шаблонні змінні і змінні-теги описуються як вбудовані - inline. Внаслідок цього код буде менш залежним від компоновщика (linker) і це може збільшити продуктивність.

Також розглянуті ідеї для С++20. Мабуть, найбільш цікавим є operator<=>(), який генерує всі компаратори для порівняння даних, які він приймає в якості параметрів.

Також в оригінальному джерелі є міні-опитування в чому найбільші потреби для розробників. Переважну більшість голосів було дано за потребу в "модулях, які не експортують макроси і є максимально швидкі для компіляції".

Цікаво дізнатися вашу думку про стандарт С++17. Звісно, на фоні С++11 новий стандарт не багатий, я думаю що це тому що перехід між С++03 і С++11 займав багато часу (~10 років), що вплинуло на значні покращення при виході останнього. Однак С++17 містить деякі важливі аспекти, хоч їх і небагато в порівнянні з С++11.

Про більш детальні особливості С++17 можна дізнатися тут.
Які з особливостей С++17 додані в IDE MS VS 2017 можна подивитися тут.

Ну і карта С++17 до теми:
https://s8.hostingkartinok.com/uploads/images/2017/06/a1b66448fde2bea9615d4c61fbb978e7.png

Because tomorrow may be gone.