# C++17
 - YÖNLENDİRME 
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.
   - YÖNLENDİRME '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  YÖNLENDİRME 'a alternatif olarak  YÖNLENDİRME anahtar sözcüğünün kullanımına izin verilmesi 
  - Süslü parantez kullanılarak yapılan  YÖNLENDİRME tür çıkarımına dair yeni kurallar 
  - İç içe namespace tanımları için  YÖNLENDİRME yerine  YÖNLENDİRME kullanılabilmesi 
  - Namespace'lerde ve enum türlerinde niteleyici (attribute) kullanımına izin verilmesi
  - Yeni standard niteleyiciler:  YÖNLENDİRME ,  YÖNLENDİRME ,  YÖNLENDİRME 
  - UTF-8 ( YÖNLENDİRME ) character literals 
  - Heksadesimal floating-point desteği
   - YÖNLENDİRME '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  YÖNLENDİRME 
  - Structured binding  YÖNLENDİRME ,  YÖNLENDİRME 
   - YÖNLENDİRME ve  YÖNLENDİRME ifadelerinde tanımlama yapmaya izin verilmesi
   - YÖNLENDİRME türünde bir ifadeden (expression),  YÖNLENDİRME 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
   - YÖNLENDİRME (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:  YÖNLENDİRME yerine  YÖNLENDİRME kullanılabilir ve böylece  YÖNLENDİRME 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.
   - YÖNLENDİRME önişlemci direktifini kullanarak bir başlık dosyasının ulaşılabilir olup olmadığına karar verilebilmesi
   - YÖNLENDİRME 'ın değerinin  YÖNLENDİRME 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  YÖNLENDİRME 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.