En İyi Sorular
Zaman Çizelgesi
Sohbet
Bakış Açıları
C++17
Vikipedi'den, özgür ansiklopediden
Remove ads
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.[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.
Remove ads
Yeni özellikler
Özetle
Bakış açısı
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[5]- Bir template'e geçilen template parametresinde (template template parameter) kullanılmak üzere
class'a alternatif olaraktypenameanahtar sözcüğünün kullanımına izin verilmesi [6] - Süslü parantez kullanılarak yapılan
autotür çıkarımına dair yeni kurallar [7][8] - İç içe namespace tanımları için
namespace X { namespace Y { … } }yerinenamespace 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] ifveswitchifadelerinde tanımlama yapmaya izin verilmesi[21]Ttüründe bir ifadeden (expression),Ttü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)yerinestd::pair(5.0, false)kullanılabilir ve böylecestd::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ğerinin201703Lolarak 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]
Kütüphane
- 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
- String ve karakter dizileri üzerinde salt okunur (read-only), sahip olmayan (non-owning) görüş türü olan
- Sıradışı durum yönetiminde
std::uncaught_exceptionfonksiyonuyla yerdeğiştirmek üzerestd::uncaught_exceptions[10][32] std::mapvestd::unordered_maptutucuları için yeni eleman ekleme fonksiyonları:try_emplace,insert_or_assign[33][34]- "contiguous iterator" tanımı [34][35]
boost::filesystemkütüphanesi baz alınarak tasarlanmış bir dosya sistemi kütüphanesi olanstd::filesystem[36]- Standard algoritmalar için paralellik desteği [37]
- Elliptik integral ve Bessel fonksiyonları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::disjunctionvestd::negationmetafonksiyonları[41]- Çokbiçimli bellek kaynağı sunan
<memory_resource>başlığı [42]
Remove ads
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ı.[43][44]
std::auto_ptr,std::random_shuffleve 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::bindve lambda gibi yapılar aldı.- Önceden deprecate edilmiş nesne barındırma belirteci olan
registeranahtar 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
Kaynakça
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads