Стандарт С++17 официально принят

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

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

std::ofstream(L"Теперь можно открывать файлы с юникодными именами.txt") << u8"Ура!";

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

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

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

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

optional<const int> x = 42;
int y = 555;
x == y; // не скомпилируется
...

optional<string> s = "Hello";
s == "Hello"; // не скомпилируется

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

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

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

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};

// P.S.: В примерах выше знак '=' тоже можно не писать 🙂

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

std::byte

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

unsigned char raw_buffer[buffer_size];

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

std::byte raw_buffer[buffer_size];

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

Источник: Рабочая Группа 21 С++