Haftalık C++ 53 – Yeni Öznitelik, “Uniform Initialization”, Enumerasyon Özellikleri ve Çıkarılan Özellikler

Evet sevgili yazılımperver dostlarım, C++ 17 yenilikleri ile devam ediyoruz. Bu yazımda da bunlardan bir kısmına daha değiniyor olacağız.

İsim Uzayları ve Enumerasyonlar için Öznitelikler

C++ 11 ile birlike bir takım öznitelikler dile eklenmişti, C++ 17 ile birlikte yeni öznitelikler ve kullanımları da eklenmiş durumda. Bu yazıda, bu özniteliklerin detaylarına girmeyeceğiz, neden? Çünkü bunlara zaten değindik, merak edenler için aşağıdaki yazıya bakmasını rica ediyorum:
Haftalık C++ 30 – Nitelikler (“attributes”)

Bu başlıkta ise C++ 17 ile gelen bu özniteliklerin kullanımlarına ilişkin bir kaç hususa değineceğim.
Bunlardan ilki, bu özniteliklerin, alan uzayları ile de birlikte kullanımı. Diyelim, kütüphane geliştiriyorsunuz ve artık kullanılmasını istemediğiniz API’leri bir adres uzayı içerisinde toplayarak gruplandırmak isterseniz bu artık mümkün olacak. Şöyle ki:

Bunlardan bir diğeri ise, bu özniteliklerin, enumeratörler için de kullanılabilmesidir. Yine hemen bir örneğe bakalım:

Yukarıdaki tanımlamada Gaziantep ve Antep aynı numerik değeri ifade etse de, Antep kullanılması durumunda, derleyici uyarı verir.

Bu kabiliyete ilişkin detaylar için N4196 önerisine bakabilirsiniz.

“Uniform Initialization” Yenilikleri

C++ 11 ile birlikte “uniform intialization”‘ın sunulduğu ve bu sayede ilklendirme işlevlerinin nasıl ortaklandığından önceki yazılarımda bahsetmiştim. C++ 11 öncesinde, değişkenlerin ilklendirilmesi için aşağıdaki tanımlamalar kullanabiliyorduk:

C++ 11 ile birlikte, bu tanımlamaları ikiye indirebildik (yukarıdaki ilklendirmeler halen geçerli tabi). Şöyle ki:

Fakat, bu kullanım bir takım sıkıntılara yol açabiliyordu. Özellikle auto tanımlamalarında.
Öncelikle, auto ile kullanım durumlarında, tipin kendisi yerine yine std::initializer_list tipi çıkarımında bulunuluyordu. Yani, aşağıdaki tanımlamaların hepsi için çıkarılan tip std::initializer_list<int>‘di.

Bu durumların yanında, auto dönüş tipine sahip fonksiyonlar için de benzer bir problem olmakta. Bu durumların önüne geçmek için, C++ 17 ile birlikte iki yeni kural tanımlandı:

  1. Birden fazla değer içeren {} ilklendirmeleri, auto değişkenler için “ill-formed”, hatalı, kabul edilecek (yukarıdaki dördüncü satır),
  2. {} içerisinde tek bir eleman var ise bu, auto değişken için çıkarım olarak std::initializer_list yerine bu elemanın tipi kullanılacak, çoklu eleman durumunda ise eskisi gibi davranacak. Yani, yukarıdaki tanımlamalar için, C++ 17 ile birlikte, çıkarımda bulunan tipler aşağıdaki gibi olacak:

Detaylar için N3922 sayfasına göz atabilirsiniz.

Enumerasyon İlklendirme

C++ 11 ile birlikte gelen enumerasyon sınıflar, normalde tanımlandıkları temel tipler ile ilklendirilememekteydiler. C++ 17 ile bu mümkün artık:

Bu ve benzeri kullanımlar için https://www.nextptr.com/tutorial/ta1425731095/typesafe-integer-types-with-list-initialization-of-scoped-enums sayfasına da göz atabilirsiniz.

Kaldırılan Özellikler

C++ 17 ile birlikte bir takım özellikler de artık dilden çıkarılmış durumda. Bunların detaylarına çok girmeyeceğim, keza artık yoklar 🙂 Elbette merak edenler için ilgili bağlantıları ekliyor olacağım. Şimdi bu kabiliyetlere bakalım:

Evet sevgili dostlar bir yazımızın daha sonuna gelmiş bulunuyoruz. C++ 17’nin de bir çok kabiliyetini işlemiş olduk. Bundan sonra artık, C++ 20’ye ilişkin kabiliyetlere ya da örnek kullanımlara eğiliyor olacağız. Bir sonraki yazıma bol kodlu günler diliyorum 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.