Π£Ρ‚Π²Π΅Ρ€ΠΆΠ΄Ρ‘Π½ стандарт C++26

ΠšΠΎΠΌΠΈΡ‚Π΅Ρ‚ ISO ΠΏΠΎ стандартизации языка C++ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ» ΡƒΡ‚Π²Π΅Ρ€Π΄ΠΈΠ» Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ спСцификации, ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰Π΅ΠΉ ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Ρ‹ΠΉ стандарт Β«C++26Β». ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ Π² спСцификации возмоТности частично ΡƒΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² компиляторах GCC, Clang ΠΈ Microsoft Visual C++. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ C++26 стандартныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Boost.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π° мСсяца утвСрТдённая спСцификация Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π° стадии ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ рСдакторской ΠΏΡ€Π°Π²ΠΊΠ΅ орфографичСских ошибок ΠΈ ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΎΠΊ. Π’ Π½Π°Ρ‡Π°Π»Π΅ ноября Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π² ISO для ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ISO/IEC 14882:2026.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ особСнности C++26:

  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ элСмСнты ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π½ΠΎΠ³ΠΎ программирования (Contracts), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ спСцификации интСрфСйсов ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ‚Ρ€Ρ‘Ρ… Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²: pre (прСдусловиС), post (постусловиС) ΠΈ contract_assert (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° утвСрТдСния). ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Β«preΒ» опрСдСляСт ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ условия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…); Β«postΒ» β€” условия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒΡΡ послС выполнСния (трСбования ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ); contract_assert β€” условия возникновСния ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ появится Π² GCC 16. int f(const int x) pre (x != 1) // трСбования ΠΊΠΎ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ post (r : r == x && r != 2) // трСбования ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ; r β€” Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ { contract_assert (x != 3); return x; }
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° рСфлСксии (Reflection), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнты ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° стадии компиляции. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Β«^^Β» для получСния ΠΌΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ грамматичСской конструкции ΠΈ Β«[:…:]Β» для выполнСния ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ прСобразования. Для прСобразования ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ Π² Ρ…ΠΎΠ΄Π΅ инспСктирования ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° std::meta ΠΈ доступны Ρ‚Π°ΠΊΠΈΠ΅ возмоТности, ΠΊΠ°ΠΊ вычислСния с константами. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° рСфлСксии Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π² GCC 16. constexpr int i = 42, j = 42; constexpr std::meta::info r = ^^i, s = ^^i; static_assert(r == r && r == s); static_assert(^^i != ^^j); // β€˜i’ ΠΈ β€˜j’ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ значСния. static_assert(constant_of(^^i) == constant_of(^^j)); // β€˜i’ ΠΈ β€˜j’ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ static_assert(^^i != std::meta::reflect_constant(42)); // отличаСтся ΠΎΡ‚ значСния 42
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Β«template forΒ» для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° элСмСнтов, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Π½Π° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ рСфлСксии (ΠΌΠ΅Ρ‚Π°ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹), Π½Π° этапС компиляции Π² стилС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°. ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Β«template forΒ» Ρ‚Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π° раскрываСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΈ каТдая итСрация обрабатываСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ области видимости, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ΅Π½ΡΡŽΡ‰Π°ΡΡΡ Π² Ρ†ΠΈΠΊΠ»Π΅ пСрСмСнная являСтся константой. Π’ контСкстС рСфлСксии Β«template forΒ» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для ΠΎΠ±Ρ…ΠΎΠ΄Π° свойств классов ΠΈΠ»ΠΈ пСрСчислСний. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ появится Π² GCC 16. void f() { template for (constexpr int I : std::array{1, 2, 3}) { static_assert(I < 4); } } Π±ΡƒΠ΄Π΅Ρ‚ раскрыто Π²: void f() { { constexpr auto&& __range = std::array{1, 2, 3}; constexpr auto __begin = __range.begin(); constexpr auto __expansion-size = __range.end() β€” __begin; // 3 { constexpr int I = *(__begin + 0); static_assert(I < 4); } { constexpr int I = *(__begin + 1); static_assert(I < 4); } { constexpr int I = *(__begin + 2); static_assert(I < 4); } } }
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ std::execution для асинхронного ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния ΠΊΠΎΠ΄Π°. ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ scheduler, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ выполнСния Ρ€Π°Π±ΠΎΡ‚ (ΠΏΠΎΡ‚ΠΎΠΊ, ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², GPU, event loop), sender, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΈ receiver β€” ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. using namespace std::execution; scheduler auto sch = thread_pool.scheduler(); sender auto begin = schedule(sch); sender auto hi = then(begin, []{ std::cout < Β«Hello world! Have an int.Β»; return 13; }); sender auto add_42 = then(hi, [](int arg) { return arg + 42; }); auto [i] = this_thread::sync_wait(add_42).value();
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° std::simd для распараллСливания выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π½Π°Π±ΠΎΡ€ΠΎΠ² инструкций SIMD, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ AVX-512 ΠΈ NEON, с использованиСм стандартной систСмы Ρ‚ΠΈΠΏΠΎΠ² C++. std::simd<float> a = {1.0f, 2.0f, 3.0f, 4.0f}; std::simd<float> b = {5.0f, 6.0f, 7.0f, 8.0f}; std::simd result = a + b;
  • ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π° рСализация Π²Π΅ΠΊΡ‚ΠΎΡ€Π° (массива) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° std::inplace_vector, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Π² стСкС, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ опрСдСляСтся Π½Π° этапС компиляции. API Π±Π»ΠΈΠ·ΠΎΠΊ ΠΊ std::vector, Π½ΠΎ элСмСнты массива хранятся Π½Π΅ Π² Β«ΠΊΡƒΡ‡Π΅Β», Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. inplace_vector a(10); inplace_vector b(std::move(a)); assert(a.size() == 10);
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Β«#embedΒ», прСдназначСнная для встраивания Π² ΠΊΠΎΠ΄ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… рСсурсов. const unsigned char icon_display_data[] = { #embed Β«art.pngΒ» };
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π½Π° этапС компиляции ΠΏΡ€ΠΈ ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π² контСкстС constexpr. constexpr std::optional<unsigned> checked_divide(unsigned n, unsigned d) { try { return divide(n, d); } catch (…) { return std::nullopt; } } constexpr date parse_date(std::string_view input) { auto [correct, year, month, day] = ctre::match<Β«([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})Β»>(input); if (!correct) { throw incorrect_date{input}; } return build_date(year, month, day); }
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° структура Π΄Π°Π½Π½Ρ‹Ρ… std::hive для нСупорядочСнного хранСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ обСспСчСния ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования памяти, освободившСйся послС ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹Ρ… элСмСнтов. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° для Π½Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ с высокой ΠΈΠ½Ρ‚Π΅Π½ΡΠΈΠ²Π½ΠΎΡΡ‚ΡŒΡŽ добавлСния ΠΈ удалСния элСмСнтов Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌ порядкС. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ массивов, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнта Π² std::hive Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ сдвига Π΄Ρ€ΡƒΠ³ΠΈΡ… элСмСнтов, Π° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠ΅ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ элСмСнта пустым с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ освободившСйся ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° std::linalg c API для Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Ρ‹, основанный Π½Π° BLAS.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° синхронизации Hazard pointer, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π³ΠΎ Π±Π΅Π· выставлСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ освобоТдСниС памяти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ продолТаСтся Ρ€Π°Π±ΠΎΡ‚Π° Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…. ΠŸΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΎΠ½ лишь помСчаСтся ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹ΠΌ, Π½ΠΎ занимаСмая ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒ освобоТдаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ снимут hazard-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, выставляСмый Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° синхронизации RCU (Read-Copy Update) β€” ΠΏΡ€ΠΈ опСрациях записи создаётся Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ, Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со старым экзСмпляром. ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ измСнСния Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр становится Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΈ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния ΡƒΠΆΠ΅ производятся с Π½ΠΈΠΌ, Π° старый экзСмпляр удаляСтся послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΡ… Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².
  • ВнСсСны измСнСния для усилСния бСзопасности стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ допустимых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π° Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π±ΡƒΡ„Π΅Ρ€Π°. НапримСр, ΠΏΡ€ΠΈ доступС ΠΊ элСмСнту Β«constexpr reference operator[](size_type idx) const;Β» добавляСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° условия Β«idx < size()".
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова Β«constexprΒ» с Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Β«newΒ» (placement new) для размСщСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Π·Π°Ρ€Π°Π½Π΅Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти Π²ΠΎ врСмя компиляции.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° структурированных привязок (structured binding) Π² контСкстС Β«constexprΒ», Ρ‚.Π΅. ссылки Π½Π° константныС выраТСния Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ сами ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ константными выраТСниями. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° для массивов ΠΈ простых структур. constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
  • Π’ структурированныС привязки Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования синтаксиса «…» для указания ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² (pack), Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π΅ΡΡ число элСмСнтов ΠΈΠ· присваиваСмой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. auto [x,y,z] = f(); // Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ x, y, z Π±ΡƒΠ΄ΡƒΡ‚ записаны Ρ‚Ρ€ΠΈ элСмСнта, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½Π½Ρ‹Π΅ f(). auto […xs] = f(); // Π² ΠΏΠ°ΠΊΠ΅Ρ‚ xs Π±ΡƒΠ΄ΡƒΡ‚ записаны всС элСмСнты, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½Π½Ρ‹Π΅ f(). auto [x, …rest] = f(); // Π’ x Π±ΡƒΠ΄Π΅Ρ‚ записан ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт, Π° Π² rest β€” ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅. auto [x, y, …rest] = f(); // Π’ x Π±ΡƒΠ΄Π΅Ρ‚ записан ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт, Π² y β€” Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Π° Π² rest β€” Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ. auto [x, …rest, z] = f(); // Π² x β€” ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, Π² rest β€” Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Π² z β€” Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Β«Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ пСрСмСщаСмости» Ρ‚ΠΈΠΏΠΎΠ² (Trivial Relocatability), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ пСрСмСщСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ‡Π΅Ρ€Π΅Π· ΠΈΡ… ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² памяти Π±Π΅Π· Π²Ρ‹Π·ΠΎΠ²Π° конструкторов ΠΈΠ»ΠΈ дСструкторов. Для классов Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ свойства memberwise_trivially_relocatable ΠΈ memberwise_replaceable, Π° для Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ пСрСмСщСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ trivially_relocate_at ΠΈ trivially_relocate.
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° прикрСплСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main() ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ ΠΈ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main() Π² ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… модулях.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Π²Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Β«friendΒ» (Β«friend Ts…»).
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ для структурированных привязок;
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ синтаксис β€˜= delete(Β«ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Β»)’.
  • Π’ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ символов Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Β«@Β», Β«$Β» ΠΈ Β«`Β».
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ примСнСния структурированного связывания (structured binding) Π² качСствС условия Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… if ΠΈ switch.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования сразу Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π΅ΠΉ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Β«_Β» Π² ΠΎΠ΄Π½ΠΎΠΉ области видимости, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ конструкции: struct S { int _, _; }; void func() { int _, _; } void other() { int _; // Ρ€Π°Π½Π΅Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ -Wunused }
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования строковых Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ² Π² контСкстС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ массива символов ΠΈ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄, Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя компиляции для диагностичСских сообщСний ΠΈ прСпроцСссинга, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² _Pragma, asm, extern, static_assert, [[deprecated]] ΠΈ [[nodiscard]].
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: Β«__builtin_is_within_lifetimeΒ» для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ активности Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ Π² ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡΡ… (union) ΠΈ Β«__builtin_is_virtual_base_ofΒ» для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ являСтся Π»ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ.
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ бСсконСчныС Ρ†ΠΈΠΊΠ»Ρ‹ Π±Π΅Π· Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ повСдСния.
  • ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ Π²Ρ‹Π²ΠΎΠ΄ ошибки ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ указатСля Π½Π° Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ.
  • ОбъявлСн ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ синтаксис опрСдСлСния Π²Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² с ΠΌΠ½ΠΎΠ³ΠΎΡ‚ΠΎΡ‡ΠΈΠ΅ΠΌ Π±Π΅Π· ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ запятой (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° указываСтся Β«void e(int…)Β» вмСсто Β«void e(int, …)Β»).
  • Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ использованиС макросов для объявлСния ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.
  • ΠŸΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½ΠΎ Π² разряд ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ нСявных ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ пСрСчисляСмых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² арифмСтичСских вычислСниях. int main() { enum E1 { e }; enum E2 { f }; bool b = e <= 3.7; // устарСло int k = f β€” e; // устарСло int x = +f β€” e; // OK }
  • ΠŸΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° прямого сравнСния массивов. int arr1[5]; int arr2[5]; bool same = arr1 == arr2;
  • ОбъявлСн ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ класс is_trivial.

    Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ