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ı.
* `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