C++17

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.

 Tarihi 
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ğı () aşamasına getirildi. Bu taslak oy birliği ile onaylanmış ve tamamlanan standard Aralık 2017'de basılmıştır. 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
C++17 ile pek çok yeni özellik tanıtılmıştır. Tam olmayan bir liste aşağıda görülebilir.

Dil
 'teki text mesajı parametresi geçilmesinin isteğe bağlı hale getirilmesi
 Bir template'e geçilen template parametresinde (template template parameter) kullanılmak üzere 'a alternatif olarak  anahtar sözcüğünün kullanımına izin verilmesi 
 Süslü parantez kullanılarak yapılan  tür çıkarımına dair yeni kurallar 
 İç içe namespace tanımları için  yerine  kullanılabilmesi 
 Namespace'lerde ve enum türlerinde niteleyici (attribute) kullanımına izin verilmesi
 Yeni standard niteleyiciler: , , 
 UTF-8 () character literals 
 Heksadesimal floating-point desteği
 'nun template parametrelerinde tür (type) veya nesne (non-type) olarak kullanılabilmesi
 Tür olmayan her template argümanının derleme zamanında çalıştırılabilmesi 
 Değişken sayılarda parametre alabilen (variadic) template'ler için katlama (fold) ifadeleri desteği
 Derleme zamanı koşul yapısı olan 
 Structured binding , 
  ve  ifadelerinde tanımlama yapmaya izin verilmesi
  türünde bir ifadeden (expression),  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
  (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:  yerine  kullanılabilir ve böylece  gibi bir yardımcı template fonksiyon çağrısına da gerek kalmaz.
 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.
  önişlemci direktifini kullanarak bir başlık dosyasının ulaşılabilir olup olmadığına karar verilebilmesi
 'ın değerinin  olarak değiştirilmesi
 Harici durum spesifikasyonunun fonksiyon türünün bir parçası haline getirilmesi
 Lambda ifadelerinde "*this"'in değer olarak kapılmasına (capture) izin verilmesi

Kütüphane
 Aşağıdaki listenin de dahil olduğu, Library Fundamentals TS I'in büyük çoğunluğu:
 String ve karakter dizileri üzerinde salt okunur (read-only), sahip olmayan (non-owning) görüş türü olan std::string_view
 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 
 std::map ve std::unordered_map tutucuları için yeni eleman ekleme fonksiyonları: try_emplace, insert_or_assign 
 "contiguous iterator" tanımı 
 boost::filesystem kütüphanesi baz alınarak tasarlanmış bir dosya sistemi kütüphanesi olan std::filesystem
 Standard algoritmalar için paralellik desteği 
 Elliptik integral ve Bessel fonksiyonlarını da içeren özel matematik fonksiyonları
 Bir etiketli union (tagged union) olan ve tanımlandığı çeşitli türlerden yalnızca birini tutabilen std::variant
 Bir byte'ı modellemek için char veya unsigned char türünün yerine kullanılabilecek olan std::byte
 std::conjunction, std::disjunction ve std::negation metafonksiyonları
 Çokbiçimli bellek kaynağı sunan <memory_resource> başlığı 

Kaldırılan özellikler
C++'ın bu revizyonunda yalnızca yeni özellikler eklenmemiş, aynı zamanda bazı kaldırılanlar da olmuştur.
 Trigraph'lar (??!) kaldırıldı.IBM comment on preparing for a Trigraph-adverse future in C++17 , IBM paper N4210, 2014-10-10. Authors: Michael Wong, Hubert Tong, Rajan Bhakta, Derek Inglis
 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ı. 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  anahtar sözcüğü kaldırıldı. Bu anahtar sözcük hala ayrımıştır ancak artık kullanılmamaktadır.

Derleyici desteği
 GCC versiyon 8'den itibaren C++17 dil özelliklerininin tamamını desteklemektir.
 Clang 5 ve sonraki versiyonlarının hepsi C++17 dil özelliklerininin tamamını desteklemektir.
 Visual Studio 2017 15.8 (MSVC 19.15) sonrası C++17 dil özelliklerininin tamamını desteklemektir.

 Kaynakça