const_cast — C++'ta const/volatile niteliklerini bir işaretçiden veya referanstan kaldırmaya veya eklemeye yarayan özel bir tür dönüşüm operatörüdür. En sık, bir nesneyi const modifikatörü ile tanımlandığında, herhangi bir const tür bekleyen bir fonksiyona geçiş yapmak için kullanılır.
Kullanım:
const nesnesine işaret eden bir işaretçi/referans üzerinden yazma işlemi yapılamaz. Ancak, nesne gerçekten const değilse, const'ı geçici olarak kaldırmak güvenlidir.const ise (örneğin, const veri segmentinde yer alıyorsa veya const T& küresel olarak geliyorsa), kaldırılmış const işaretçisi ile yazmaya çalışmak belirsiz bir davranışa yol açar.void foo(int* p) { *p = 42; } void bar(const int* q) { // Sadece nesne gerçekten const değilse const'ı kaldır! foo(const_cast<int*>(q)); }
Eğer bar fonksiyonuna bir int işaretçisi geçilirse, const'ı güvenle kaldırmak mümkündür. Eğer const int geçilirse, yazma işlemi sırasında UB gerçekleşecektir.
const olmayan argümanlar gerektirir.const yöntemler içerisinde kullanımı (örneğin, sonuçları cachelemek). Bu durumda alan mutable olarak işaretlenir.const olarak korunan belleğe yazı yazmaya çalışırken UB.const_cast ihtiyacı, fonksiyon imzasını gözden geçirmek için bir sebep olabilir."const_cast kullanarak, bir nesnenin
const'ını literallerden veya yalnızca okunabilir bir bellek segmentinde bulunan bir nesneden kaldırmak mümkün mü? Bunun tehlikeleri nelerdir?"
Cevap: İşaretçiden veya referanstan const özelliğini kaldırmak mümkündür, ancak bir literali veya yalnızca okunabilir bir alan içinde yer alan bir değeri değiştirmeye çalışmak belirsiz bir davranışa yol açar — bu çöküşe veya yazma işleminin göz ardı edilmesine neden olabilir.
Örnek:
const char* str = "hello"; char* p = const_cast<char*>(str); p[0] = 'H'; // UB: string literal yalnızca okunabilir bellek içinde!
Hikaye
Projede alanlardan
constkaldırılmış, ardından bu alanlar üzerinde yazma işlemi yapılmış, gerçekconstolan bir değer (küresel sabit) ile geçirilmiş olduğunun farkında olmadan — uygulama bazı platformlarda segmentation fault ile çöküyordu.
Hikaye
Kodda,
mutablenitelendirmesi olmayanconstyöntemleri atlatmak içinconst_castkullanılmış:constyöntem içinde sınıf alanları değiştirilmiş, bu da çok zor tespit edilen hatalara yol açmıştır.
Hikaye
STL kaplarına (örneğin,
const std::vector) yanlışconst_castuygulaması yapılmış, sonunda konteyner üzerinde değişiklikler yapılmış — bu her zaman hemen hata vermiyor ama konteynırla ilgili ilerideki işlemlerde tahmin edilemeyen davranışlara yol açıyor.