Написать пост

Стандарт С++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++.

Следите за новыми постами
Следите за новыми постами по любимым темам
5К открытий5К показов