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ğı (İngilizce:Draft International Standard (DIS)) 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
static_assert'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 class'a alternatif olarak typename anahtar sözcüğünün kullanımına izin verilmesi
Süslü parantez kullanılarak yapılan auto tür çıkarımına dair yeni kurallar
İç içe namespace tanımları için namespaceX{namespaceY{…}} yerine namespaceX::Y{…} kullanılabilmesi
Namespace'lerde ve enum türlerinde niteleyici (attribute) kullanımına izin verilmesi
Yeni standard niteleyiciler: [[fallthrough]], [[maybe_unused]], [[nodiscard]]
if ve switch ifadelerinde tanımlama yapmaya izin verilmesi
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
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.
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
__cplusplus'ın değerinin 201703L 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
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 register 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.