C++20, C++17'den sonra C++ programlama dili için ISO/IEC standardının revizyonunun adıdır.[1] Bu standart[2] Şubat 2020'de Prag'daki toplantıda WG21 tarafından sonuçlandırıldı.[3] Taslak 4 Eylül 2020 tarihinde onaylandıktan sonra C++20 standardı şu anda son çalışmalardan geçiyor.[4][5]

C++20, C++17 ve C++14'ten daha fazla sayıda yeni ve büyük özellikler ekledi.[6] C++20'ye dahil ve kabul edilen değişikliklerin listesinin bir kısmı aşağıda listelenmiştir.[7]

Yeni özellikler değiştir

C++20 ile birçok yeni özellik tanıtıldı. Aşağıdaki liste tamamlanmamış olabilir.

Dil değiştir

  • kısa sözdizimi ile,[8] konseptler[9]
  • modüller[10]
  • belirlenmiş ilklendiriciler[11] (C99 özelliğine ve yaygın G ++ uzantısına dayanarak)
  • lambda yakalama olarak[=, this][12]
  • lambdalardaki şablon parametre listeleri[13]
  • "uzay gemisi operatörü" (<=>) kullanarak üç yönlü karşılaştırma
  • aralık tabanlı bir for ifadesi içerisinde ek bir değişkenin ilklendirilmesi[14]
  • değerlendirilmemiş bağlamlarda lambdalar[15][16]
  • varsayılan yapılandırılabilir ve atanabilir durumsuz lambdalar[17]
  • şablon parametreleri olarak dize değişmezleri[18]
  • belirli durumlardatypename ihtiyacı kaldırıldı[19]
  • yeni standart özellikler[[no_unique_address]],[20][[likely]] ve [[unlikely]][21]
  • koşullu explicit, belirtik değiştiricinin bir bool ifadesine bağlı olmasına izin verir[22]
  • genişletilmiş constexpr: virtual fonksiyonlar[23], union[24], try-catch,[25] dynamic_cast ve typeid[26], std::pointer_traits[27]
  • yeni consteval anahtar sözcüğünü kullanan dolaysız fonksiyonlar[28]
  • işaretli tam sayılar artık ikinin tümleyeni kullanılarak gösterilmek üzere tanımlanmaktadır (işaretli tam sayı taşması tanımsız davranış olarak kalır)[29]
  • revize edilmiş bir bellek modeli[30]
  • yapısal bağlamalarda çeşitli iyileştirmeler (lambda yakalamalarıyla etkileşim, static ve thread_local depolama süresi)[31][32]
  • Eş programlar[33]
  • kapsamlı enumlardausing[34]
  • constinit anahtar sözcüğü[35]

Kütüphane değiştir

  • aralıklar (The One Ranges Proposal)[36]
  • Diziler için std::make_shared ve std::allocate_shared[37]
  • atomik akıllı işaretçiler (std::atomic<shared_ptr<T>> ve std::atomic<weak_ptr<T>> )[38]
  • bir işaretçiyi ham işaretçiye dönüştürmek için std::to_address[39]
  • <chrono>'ya takvim ve saat dilimi eklemeleri[40]
  • std::span, bitişik bir diziye bir görünüm sağlar[41]
  • <version>başlığı[42]
  • memcpy() 'den daha az ayrıntı ve derleyici dahili öğelerinden daha fazla yararlanma yeteneği ile nesne gösterimlerinin tür dökümleri için std::bit_cast<>[43]
  • özellik test makroları[44]
  • çeşitli constexpr kitaplık bitleri[45]
  • varsayılan ilklendirme ile akıllı işaretçi oluşturma[46]
  • std::map::contains methodu[47]
  • Bit işlemler,[48] ve log2 işlemleri[49][50][51]

Kullanımdan kaldırma değiştir

  • Altsimge ifadelerinde virgül operatörü kullanımı kullanımdan kaldırıldı[52]
  • (çoğu) volatile kullanımdan kaldırıldı[53]

Yeni (ve değiştirilmiş) anahtar kelimeler değiştir

concept, constinit,[54] consteval, co_await, co_return, co_yield, requires, export ve char8_t.gibi birçok yeni anahtar kelime (ve yeni "uzay gemisi operatörü" (<=>)) eklendi.[55] Ek olarak explicit, C++20'den itibaren ifade alabilecek.[56]

Anahtar kelimelere ek olarak, yeni import ve module dahil olmak üzere özel anlamı olan tanımlayıcılar da var.

C++20'deki yeni nitelikler: [[likely]], [[unlikely]] ve [[no_unique_address]][57]

Ayrıca bakınız değiştir

Kaynaklar değiştir

  1. ^ "The Standard". isocpp.org. 19 Eylül 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 7 Eylül 2020. 
  2. ^ "P1000R3: C++ IS schedule" (PDF). 1 Ekim 2019. 14 Kasım 2019 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 13 Şubat 2020. 
  3. ^ "N4817: 2020 Prague Meeting Invitation and Information" (PDF). 6 Kasım 2019. 29 Aralık 2019 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 13 Şubat 2020. 
  4. ^ "Current Status". isocpp.org. 8 Eylül 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 7 Eylül 2020. 
  5. ^ "C++20 Approved -- Herb Sutter". isocpp.org. 11 Eylül 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Eylül 2020. 
  6. ^ "Why does the C++ standard ship every three years?". 13 Temmuz 2019 tarihinde kaynağından arşivlendi. 
  7. ^ "P0592R0: To boldly suggest an overall plan for C++20". 8 Mart 2017 tarihinde kaynağından arşivlendi. 
  8. ^ "P1141R1 - Yet another approach for constrained declarations". 11 Kasım 2018 tarihinde kaynağından arşivlendi. 
  9. ^ "P0606R0: Concepts Are Ready" (PDF). 28 Mart 2017 tarihinde kaynağından (PDF) arşivlendi. 
  10. ^ "N4720: Working Draft, Extensions to C++ for Modules" (PDF). 30 Nisan 2019 tarihinde kaynağından (PDF) arşivlendi. 
  11. ^ "Designated Initialization Wording". 15 Ekim 2017 tarihinde kaynağından arşivlendi. 
  12. ^ "Allow lambda capture [=, this]". 9 Şubat 2019 tarihinde kaynağından arşivlendi. 
  13. ^ "Familiar template syntax for generic lambdas". 21 Kasım 2018 tarihinde kaynağından arşivlendi. 
  14. ^ "Range-based for statements with initializer". 6 Nisan 2017 tarihinde kaynağından arşivlendi. 
  15. ^ "Trip Report: C++ Standards Meeting in Albuquerque, November 2017". There's Waldo! (İngilizce). 20 Kasım 2017. 11 Aralık 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Aralık 2017. 
  16. ^ "Wording for lambdas in unevaluated contexts" (PDF). 12 Aralık 2017 tarihinde kaynağından (PDF) arşivlendi. 
  17. ^ "Default constructible and assignable stateless lambdas" (PDF). 12 Aralık 2017 tarihinde kaynağından (PDF) arşivlendi. 
  18. ^ "String literals as non-type template parameters" (PDF). 11 Aralık 2017 tarihinde kaynağından (PDF) arşivlendi. 
  19. ^ "Down with typename!". 22 Nisan 2018 tarihinde kaynağından arşivlendi. 
  20. ^ "Language support for empty objects". 17 Nisan 2018 tarihinde kaynağından arşivlendi. 
  21. ^ "Proposed wording for likely and unlikely attributes (Revision 5)". 13 Mayıs 2018 tarihinde kaynağından arşivlendi. 
  22. ^ "explicit(bool)". www.open-std.org. 20 Temmuz 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 13 Kasım 2018. 
  23. ^ "Allowing Virtual Function Calls in Constant Expressions". www.open-std.org. 11 Haziran 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Mart 2019. 
  24. ^ "P1330R0 - Changing the active member of a union inside constexpr". 26 Temmuz 2019 tarihinde kaynağından arşivlendi. 
  25. ^ "P1002R0 - Try-catch blocks in constexpr functions" (PDF). 11 Kasım 2018 tarihinde kaynağından (PDF) arşivlendi. 
  26. ^ "P1327R0 - Allowing dynamic_cast, polymorphic typeid in Constant Expressions". 26 Temmuz 2019 tarihinde kaynağından arşivlendi. 
  27. ^ "P1006R1 - Constexpr in std::pointer_traits" (PDF). 11 Kasım 2018 tarihinde kaynağından (PDF) arşivlendi. 
  28. ^ "P1073R2 - Immediate functions". 26 Ekim 2018 tarihinde kaynağından arşivlendi. 
  29. ^ "P1236R0: Alternative Wording for P0907R4 Signed Integers are Two's Complement". 11 Kasım 2018 tarihinde kaynağından arşivlendi. 
  30. ^ "P0668R4: Revising the C++ memory model". 11 Kasım 2018 tarihinde kaynağından arşivlendi. 
  31. ^ "P1091R1: Extending structured bindings to be more like variable declarations". www.open-std.org. 26 Ocak 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Şubat 2019. 
  32. ^ "P1091R2: Extending structured bindings to be more like variable declarations". www.open-std.org. 26 Ocak 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Şubat 2019. 
  33. ^ "N4649: Working Draft, Technical Specification on C++ Extensions for Coroutines" (PDF). 16 Mayıs 2017 tarihinde kaynağından (PDF) arşivlendi. 
  34. ^ "P1099R5: Using Enum". www.open-std.org. 20 Temmuz 2019. 20 Ağustos 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 20 Temmuz 2019. 
  35. ^ "P1143R2: Adding the constinit keyword". www.open-std.org. 20 Temmuz 2019. 20 Ağustos 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 20 Temmuz 2019. 
  36. ^ "P0896R3" (PDF). 11 Kasım 2018 tarihinde kaynağından (PDF) arşivlendi. 
  37. ^ "Extending make_shared to Support Arrays". 6 Eylül 2017 tarihinde kaynağından arşivlendi. 
  38. ^ "Revising atomic_shared_ptr for C++20". JTC1/SC22/WG21 - The C++ Standards Committee - ISOCPP. ISO. 4 Ocak 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 27 Aralık 2018. 
  39. ^ "Utility to convert a pointer to a raw pointer". 20 Şubat 2018 tarihinde kaynağından arşivlendi. 
  40. ^ "Extending <chrono> to Calendars and Time Zones". 13 Mayıs 2018 tarihinde kaynağından arşivlendi. 
  41. ^ "span: bounds-safe views for sequences of objects". 18 Mayıs 2019 tarihinde kaynağından arşivlendi. 
  42. ^ "<version>". 18 Mayıs 2019 tarihinde kaynağından arşivlendi. 
  43. ^ "Bit-casting object representations". www.open-std.org. 18 Ağustos 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 10 Kasım 2018. 
  44. ^ "Integrating feature-test macros into the C++ WD". www.open-std.org. 20 Temmuz 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 10 Kasım 2018. 
  45. ^ "P1032R1 - Misc constexpr bits". 26 Ekim 2018 tarihinde kaynağından arşivlendi. 
  46. ^ "Smart pointer creation with default initialization". 26 Ocak 2019 tarihinde kaynağından arşivlendi. 
  47. ^ "std::map::contains - cppreference.com". en.cppreference.com. 11 Haziran 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 12 Mayıs 2020. 
  48. ^ "P0553R4: Bit operations". www.open-std.org. 20 Temmuz 2019. 20 Temmuz 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 20 Temmuz 2019. 
  49. ^ "P0556R3: Integral power-of-2 operations". www.open-std.org. 6 Haziran 2018. 26 Haziran 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Ağustos 2020. 
  50. ^ "P1355R2 Exposing a narrow contract for ceil2". www.open-std.org. 11 Haziran 2019. 5 Ağustos 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Ağustos 2020. 
  51. ^ "On the names of low-level bit manipulation functions" (PDF). www.open-std.org. 11 Şubat 2020. 24 Mart 2020 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 8 Ağustos 2020. 
  52. ^ "P1161R2: Deprecate uses of the comma operator in subscripting expressions". www.open-std.org. 20 Temmuz 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 20 Temmuz 2019. 
  53. ^ "P1152R4: Deprecating volatile". www.open-std.org. 20 Temmuz 2019. 23 Haziran 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 20 Temmuz 2019. 
  54. ^ "P1143R2: Adding the constinit keyword". www.open-std.org. 20 Temmuz 2019. 20 Ağustos 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 20 Temmuz 2019. 
  55. ^ "C++ keywords - cppreference.com". en.cppreference.com. 19 Mart 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: 4 Ağustos 2019. 
  56. ^ "explicit specifier - cppreference.com". en.cppreference.com. 21 Şubat 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: 4 Ağustos 2019. 
  57. ^ "attribute specifier sequence(since C++11) - cppreference.com". en.cppreference.com. 5 Temmuz 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: 4 Ağustos 2019. 

Dış bağlantılar değiştir