İçeriğe atla

C++17

Vikipedi, özgür ansiklopedi

C++17, C++ programlama dili için yayınlanan ISO/IEC 14882 standardının bir versiyonudur. C++17, bir önceki C++ standardı olan C++14'ün yerine geçmiş, sonrasında C++20 ile yerdeğiştirmiştir.

C++ Standard Komitesi yayın döngüsünü 3 senelik periyotlara sabitlemeden önce, C++17'nin yayın tarihinin ne olacağı belli değildi. O dönem, C++11 için C++0x veya C++1x, C++14 için C++1y denilmesi gibi, C++17 için de C++1z denilmiştir. C++17 spesifikasyonu Mart 2017'de Uluslararası Standard Taslağı (İngilizceDraft International Standard (DIS)) aşamasına getirildi.[1][2] Bu taslak oy birliği ile onaylanmış[3] ve tamamlanan standard Aralık 2017'de basılmıştır.[4] C++ Standard Kütüphanesi'nde az sayıda değişiklik yapılmıştır, bunlar arasında <algorithm> başlığındaki bazı algoritmalara doğrudan (explicit) parallellik desteği ve sözdizim geliştirmeleri gösterilebilir.

Yeni özellikler

[değiştir | kaynağı değiştir]

C++17 ile pek çok yeni özellik tanıtılmıştır. Tam olmayan bir liste aşağıda görülebilir.

  • static_assert'teki text mesajı parametresi geçilmesinin isteğe bağlı hale getirilmesi[5]
  • Bir template'e geçilen template parametresinde (template template parameter) kullanılmak üzere class'a alternatif olarak typename anahtar sözcüğünün kullanımına izin verilmesi [6]
  • Süslü parantez kullanılarak yapılan auto tür çıkarımına dair yeni kurallar [7][8]
  • İç içe namespace tanımları için namespace X { namespace Y { } } yerine namespace X::Y { } kullanılabilmesi [8][9]
  • Namespace'lerde ve enum türlerinde niteleyici (attribute) kullanımına izin verilmesi[10][11]
  • Yeni standard niteleyiciler: [[fallthrough]], [[maybe_unused]], [[nodiscard]][12]
  • UTF-8 (u8) character literals[10][13]
  • Heksadesimal floating-point desteği[14][15]
  • auto'nun template parametrelerinde tür (type) veya nesne (non-type) olarak kullanılabilmesi[16]
  • Tür olmayan her template argümanının derleme zamanında çalıştırılabilmesi [10][17]
  • Değişken sayılarda parametre alabilen (variadic) template'ler için katlama (fold) ifadeleri desteği[10][18]
  • Derleme zamanı koşul yapısı olan if constexpr(expression)[19]
  • Structured binding auto [a, b] = getTwoReturnValues();, for(auto [k, v] : assocContainer){..};[20]
  • if ve switch ifadelerinde tanımlama yapmaya izin verilmesi[21]
  • T türünde bir ifadeden (expression), T türünün nesnelerinin kopyalamayla tanımlama (copy-initialization) ve doğrudan tanımlama (direct-initialization) yoluyla yapılan tanımlama, arı-sağ değer (pure right value, prvalue) türünde bir ifadeden yapıldığında, kopyalama veya taşıma yapıcı üye fonksiyonların (copy constructor, move constructor) çağrılmamasıyla sonuçlanır. Böylece verinin kopyalanmasından kaçınılır (copy ellision).
  • Hizalanmış (alignment) veriler için dinamik bellek tahsisi[22]
  • Class template argument deduction (CTAD), sınıf template'lerde parametre türlerinin argümanlardan çıkarımsanması. Kısaca, bir sınıf template'in nesnesini oluştururken parametre türlerini düşürmeye izin verir: std::pair<double, bool>(5.0, false) yerine std::pair(5.0, false) kullanılabilir ve böylece std::make_pair(5.0, false) gibi bir yardımcı template fonksiyon çağrısına da gerek kalmaz.[23][24]
  • Tek tanım kuralını (one definition rule) ihlal etmeden başlık dosyalarında değişken tanımlamaya olanak tanıyan inline değişkenler. Inline değişkenler, inline fonksiyonlarla aynı kurallara sahiptir.
  • __has_include önişlemci direktifini kullanarak bir başlık dosyasının ulaşılabilir olup olmadığına karar verilebilmesi[25]
  • __cplusplus'ın değerinin 201703L olarak değiştirilmesi[26]
  • Harici durum spesifikasyonunun fonksiyon türünün bir parçası haline getirilmesi[27]
  • Lambda ifadelerinde "*this"'in değer olarak kapılmasına (capture) izin verilmesi[28]
  • Aşağıdaki listenin de dahil olduğu, Library Fundamentals TS I'in büyük çoğunluğu:[29][30]
    • String ve karakter dizileri üzerinde salt okunur (read-only), sahip olmayan (non-owning) görüş türü olan std::string_view[31]
    • Bir nesnenin varlığını tercihe bağlı hale getiren std::optional
    • Herhangi bir türü tutabilen std::any
  • Sıradışı durum yönetiminde std::uncaught_exception fonksiyonuyla yerdeğiştirmek üzere std::uncaught_exceptions [10][32]
  • std::map ve std::unordered_map tutucuları için yeni eleman ekleme fonksiyonları: try_emplace, insert_or_assign [33][34]
  • "contiguous iterator" tanımı [34][35]
  • boost::filesystem kütüphanesi baz alınarak tasarlanmış bir dosya sistemi kütüphanesi olan std::filesystem[36]
  • Standard algoritmalar için paralellik desteği [37]
  • Elliptik integral ve Bessel fonksiyonu'larını da içeren özel matematik fonksiyonları[38]
  • Bir etiketli union (tagged union) olan ve tanımlandığı çeşitli türlerden yalnızca birini tutabilen std::variant[39]
  • Bir byte'ı modellemek için char veya unsigned char türünün yerine kullanılabilecek olan std::byte[40]
  • std::conjunction, std::disjunction ve std::negation metafonksiyonları[41]
  • Çokbiçimli bellek kaynağı sunan <memory_resource> başlığı [42]

Kaldırılan özellikler

[değiştir | kaynağı değiştir]

C++'ın bu revizyonunda yalnızca yeni özellikler eklenmemiş, aynı zamanda bazı kaldırılanlar da olmuştur.

  • Trigraph'lar (??!) kaldırıldı.[43][44]
  • std::auto_ptr, std::random_shuffle ve eski fonksiyon adaptörleri gibi deprecate edilmiş tür ve fonksiyonlar standard kütüphaneden kaldırıldı.[8][45] Bunların yerini C++11'nin geliştirimiş özellikleri; std::unique_ptr, std::shuffle, std::bind ve lambda gibi yapılar aldı.
  • Önceden deprecate edilmiş nesne barındırma belirteci olan register anahtar sözcüğü kaldırıldı.[46] Bu anahtar sözcük hala ayrımıştır ancak artık kullanılmamaktadır.

Derleyici desteği

[değiştir | kaynağı değiştir]
  • GCC versiyon 8'den itibaren C++17 dil özelliklerininin tamamını desteklemektir.[47]
  • Clang 5 ve sonraki versiyonlarının hepsi C++17 dil özelliklerininin tamamını desteklemektir.[48]
  • Visual Studio 2017 15.8 (MSVC 19.15) sonrası C++17 dil özelliklerininin tamamını desteklemektir.[49][50]
  1. ^ "N4661 Editors' Report -- Programming Languages -- C++". 21 Mart 2017. 4 Şubat 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 21 Mart 2017. 
  2. ^ "ISO/IEC DIS 14882: Programming Languages — C++" (PDF). 25 Mart 2017 tarihinde kaynağından (PDF) arşivlendi. 
  3. ^ Herb Sutter [en] (6 Eylül 2017). "C++17 is formally approved". 29 Ocak 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 12 Eylül 2017. 
  4. ^ "ISO/IEC 14882:2017". 29 Ocak 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Aralık 2017. 
  5. ^ "N3928: Extending static_assert, v2 (Walter E. Brown)" (PDF). 11 Ağustos 2015 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 3 Nisan 2015. 
  6. ^ "N4051: Allow typename in a template template parameter (Richard Smith)". 11 Ağustos 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Nisan 2015. 
  7. ^ "N3922: New Rules for auto deduction from braced-init-list (James Dennett)". 10 Ağustos 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 28 Kasım 2014. 
  8. ^ a b c "Updates to my trip report". 19 Mart 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 28 Kasım 2014. 
  9. ^ "N4230: Nested namespace definition (Robert Kawulak, Andrew Tomazos)". 3 Ağustos 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 28 Kasım 2014. 
  10. ^ a b c d e "New core language papers adopted for C++17". 27 Nisan 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 15 Kasım 2014. 
  11. ^ "N4266: Attributes for namespaces and enumerators (Richard Smith)". 6 Mart 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 15 Kasım 2014. 
  12. ^ "N4640: Working Draft, Standard for Programming Language C++" (PDF). ss. 193-195. 12 Mart 2017 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 9 Mart 2017. 
  13. ^ "N4267: Adding u8 character literals (Richard Smith)". 28 Ekim 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 15 Kasım 2014. 
  14. ^ Thomas Köppe. "Hexadecimal floating literals for C++". 21 Eylül 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 16 Temmuz 2017. 
  15. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §5.13.4. 7 Aralık 2017 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 24 Mart 2017. 
  16. ^ James Touton; Mike Spertus (23 Haziran 2016). "Declaring non-type template parameters with auto". 16 Eylül 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Kasım 2020. 
  17. ^ "N4268: Allow constant evaluation for all non-type template arguments (Richard Smith)". 12 Mart 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 15 Kasım 2014. 
  18. ^ "N4295: Folding expressions (Andrew Sutton, Richard Smith)". 4 Nisan 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 15 Kasım 2014. 
  19. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §9.4.1. 7 Aralık 2017 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 24 Mart 2017. 
  20. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §11.5. 7 Aralık 2017 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 24 Mart 2017. 
  21. ^ "Selection statements with initializer". 6 Ekim 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 9 Ekim 2018. 
  22. ^ "Dynamic memory allocation for over-aligned data". 8 Eylül 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 13 Mart 2017. 
  23. ^ "Class template argument deduction". 31 Ocak 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 30 Ocak 2019. 
  24. ^ "CppCon 2018: Timur Doumler "Class template argument deduction in C++17"". YouTube. 21 Ağustos 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 30 Ocak 2019. 
  25. ^ "N4640: Working Draft, Standard for Programming Language C++" (PDF). ss. 431-433. 12 Mart 2017 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 9 Mart 2017. 
  26. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §19.8. 7 Aralık 2017 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 24 Mart 2017. 
  27. ^ "P0012R1: Make exception specifications be part of the type system, version 5". 12 Eylül 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 17 Aralık 2018. 
  28. ^ "P0018R3: Lambda Capture of *this by Value as [=,*this], version 3". 22 Ağustos 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 21 Haziran 2021. 
  29. ^ "Adopt Library Fundamentals V1 TS Components for C++17 (R1)". 5 Nisan 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 23 Mart 2016. 
  30. ^ "Current Status". 8 Eylül 2020 tarihinde kaynağından arşivlendi. 
  31. ^ "std::basic_string_view - cppreference.com". en.cppreference.com. 17 Haziran 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 23 Haziran 2016. 
  32. ^ "N4259: Wording for std::uncaught_exceptions (Herb Sutter)" (PDF). 29 Kasım 2014 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 15 Kasım 2014. 
  33. ^ "N4279: Improved insertion interface for unique-key maps (Thomas Köppe)". 27 Nisan 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 15 Kasım 2014. 
  34. ^ a b "New standard library papers adopted for C++17". 29 Kasım 2014 tarihinde kaynağından arşivlendi. Erişim tarihi: 15 Kasım 2014. 
  35. ^ "N4284: Contiguous Iterators (Jens Maurer)". 29 Kasım 2014 tarihinde kaynağından arşivlendi. Erişim tarihi: 15 Kasım 2014. 
  36. ^ "Filesystem Library Proposal (Beman Dawes)". 20 Temmuz 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 12 Aralık 2015. 
  37. ^ "The Parallelism TS Should be Standardized". 5 Nisan 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 23 Mart 2016. 
  38. ^ "Mathematical Special Functions for C++17, v5" (PDF). 5 Nisan 2016 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 23 Mart 2016. 
  39. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §23.7. 7 Aralık 2017 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 24 Mart 2017. 
  40. ^ "A byte type definition" (PDF). 25 Mart 2017 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 25 Mart 2017. 
  41. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §23.15.8. 7 Aralık 2017 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 24 Mart 2017. 
  42. ^ "PMR (Polymorphic Memory Resources) fully described -- Nico Josuttis". 28 Ağustos 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 16 Kasım 2020. 
  43. ^ "N3981: Removing trigraphs??! (Richard Smith)". 6 Mayıs 2014. 9 Temmuz 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Nisan 2015. 
  44. ^ IBM comment on preparing for a Trigraph-adverse future in C++17 11 Eylül 2018 tarihinde Wayback Machine sitesinde arşivlendi., IBM paper N4210, 2014-10-10. Authors: Michael Wong, Hubert Tong, Rajan Bhakta, Derek Inglis
  45. ^ "N4190: Removing auto_ptr, random_shuffle(), And Old <functional> Stuff (Stephan T. Lavavej)". 20 Ekim 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 28 Kasım 2014. 
  46. ^ "C++ Keywords: register". 3 Eylül 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Eylül 2018. 
  47. ^ "C++ Standards Support in GCC - GNU Project - Free Software Foundation (FSF)". gcc.gnu.org. 4 Nisan 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Nisan 2018. 
  48. ^ "Clang - C++17, C++14, C++11 and C++98 Status". clang.llvm.org. 4 Temmuz 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 26 Haziran 2018. 
  49. ^ corob-msft. "Visual C++ Language Conformance". docs.microsoft.com. 19 Haziran 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 19 Haziran 2018. 
  50. ^ "Announcing: MSVC Conforms to the C++ Standard". 7 Mayıs 2018. 26 Ağustos 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Mayıs 2018.