constexpr – 1

constexpr kabuk değiştirmiş C++’ın en önemli anahtar sözcüklerinden biri. Üç ayrı yazımı bu anahtar sözcüğe ayıracağım. Bu okumakta olduğunuz birinci yazım.

constexpr anahtar sözcüğü “constant expression” (sabit ifadesi) sözcüklerinden uydurulmuş. constexpr anahtar sözcüğüyle tanıtılan bir varlık kod içinde sabit ifadesi olarak kullanılabiliyor. Derleyicinin derleme zamanında değerlerini bilme ya da hesaplama garantisi olan ifadelere sabit ifadesi dendiğini hatırlayın. constexpr anahtar sözcüğü hem bir değişkenin hem de bir işlevin tanımında  kullanılabiliyor. constexpr anahtar sözcüğü ile tanımlanan işlevler ikinci yazımın konusu olacak.  Şimdilik yalnızca constexpr değişkenlerle  yetineceğim:

Yukarıdaki gibi bir bildirim  okuyucuya öncelikle şu bilgileri veriyor:
x değişkeni sabit ifadesi (constant expression) gereken her yerde kullanılabilir.
x, değeri hiç değişmeyecek bir değişken. Yani hayatta olduğu sürece hep aynı değerde kalacak. Bu açıdan bakıldığında constexpr anahtar sözcüğü const anahtar sözcüğünün anlamını da içeriyor.
x ifadesi bir dizi tanımında boyut ifadesi olarak kullanılabilir. Bir numaralandırma (enumaration) değeri olarak kullanılabilir. Bir switch deyiminin case ifadesi olabilir. Sabit parametreli (nontype template parameter) bir şablonun açılımında arguman olarak kullanılabilir:
Şimdi gelelelim derleyicinin derleme zamanında yaptığı kontrollere:
constexpr ile tanıtılan bir değişkene bir sabit ifadesi ile ilk değer verilmeli  ve derleyici bu kontrolü yapmakla yükümlü. constexpr bir değişkene ilk değer verilmemesi ya da sabit ifadesi olmayan bir ifade ile ilk değer verilmesi doğrudan sentaks hatası:
const anahtar sözcüğüyle tanıtılan değişkenlerin değerlerini değiştirmeye yönelik ifadelerin geçersiz olduğunu biliyorsunuz. constexpr değişkenler için de durum farklı değil:
Peki bu durumda const anahtar sözcüğü ile constexpr anahtar sözcüğü aynı anlama mı geliyor? Kesinlikle hayır. const anahtar sözcüğü ile tanımlanan bir değişkene bir sabit ifadesi ile ilk değer vermek zorunlu değil. Bir const değişken ancak bir sabit ifadesi ile ilk değerini aldığında sabit ifadesi olarak kullanılabiliyor. Ancak constexpr değişkenlere sabit ifadesi olmayan ifadeler ile ilk değer verilemiyor ve constexpr değişkenler her zaman sabit ifadesi olarak kullanılabiliyor. Kafanız mı karıştı?
Bir global değişken ya da bir yerel değişken constexpr anahtar sözcüğü ile tanıtılabilir. Bir sınıfın bir static veri öğesi constexpr olarak tanıtılabilir. Ancak işlevlerin parametre değişkenleri ve bir sınıfın static olmayan veri öğeleri constexpr olarak tanıtılamazlar:
constexpr anahtar sözcüğünü const anahtar sözcüğü ile birlikte kullanmak sentaks hatası olmasa da çoğu zaman gereksiz. Çünkü constexpr anahtar sözcüğü const anahtar sözüğünün anlamını da içeriyor:
Lakin constexpr değişkenimiz gösterdiği yer const olan (low level const) bir gösterici ise durum farklı. (Burada nedense lakin sözcüğünü kulanmak içimden geldi.) Önce const anahtar sözcüğüyle gösterici değişkenlerin tanımlanmasını ve bu konudaki terminolojiyi bir hatırlayalım:
Şimdi de aşağıdaki koda bakalım:
Burada p değişkeni constexpr olarak tanıtılan ve gösterdiği yer const olan bir gösterici. const anahtar sözcüğü kullanılmasaydı, tanımlama yine geçerli olurdu ancak tanımlamanın anlamı değişirdi.
Bu arada constexpr değişkenlere bir sabit ifadesi ile ilk değer verilmesi zorunlu olduğundan constexpr gösterici değişkenlere de sabit ifadesi olma özelliğine sahip adreslerle ilk değer verilmeli. Yerel değişkenlerin adresleri sabit ifadesi olarak kabul edilmiyor:
Share

Necati Ergin

C ve Sistem Programcıları Derneğinde eğitmen olarak çalışıyor.

Bunlar da ilginizi çekebilir

Kod Eklemek İçin Okuyun