C++26 programlama dili: işaretçi adreslerinin basitleştirilmiş yönetimi
C++26 ile herhangi bir işaretçinin adresini yazdırabilirsiniz.
Duyuru
Rainer Grimm uzun yıllardır yazılım mimarı, ekip ve eğitim lideri olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanıyor, aynı zamanda özel konferanslarda sık sık konuşmaktan da hoşlanıyor. Modern C++ adlı blogunda C++ tutkusunu yoğun bir şekilde ele alıyor.
C++20
Yalnızca işaretçi türleri void, const void VE std::nullptr_t bunlar geçerlidir. Herhangi bir işaretçinin adresini görüntülemek istiyorsanız onu girmelisiniz (const) void* dönüştürmek.
// formatPointer20.cpp
#include <format>
#include <iostream>
#include <string>
int main() {
double d = 123.456789;
//std::cout << "&d" << std::format("{}", &d) << 'n';
std::cout << "static_cast<void *>(&d): " << std::format("{}", static_cast<void *>(&d)) << 'n';
std::cout << "static_cast<const void *>(&d): " << std::format("{}", static_cast<const void *>(&d)) << 'n';
std::cout << "nullptr: " << std::format("{}", nullptr) << 'n';
}
içinde main-Fonksiyon bir hale gelir double-Adlandırılmış değişken d değer ile 123,456789 başlatıldı. fonksiyon std::format adresi temsil eder.
İlk yorum yapılan satır adresini almaya çalışır d doğrudan std::format(„{}“, &d) harcamak. Bu satır, derleme hatasına yol açacağı için yorumlanmamıştır. fonksiyon std::format işaretçinin eklenmesini gerektirir void* VEYA const void* doğru şekilde biçimlendirmek için dönüştürüldü.
Sonraki üç satır işaretçilerin nasıl kullanılacağını gösterir std::format doğru şekilde biçimlendirilmiş ve görüntülenmiştir. Bu satırlardan ilki adresini içerir. d dönüştürdükten sonra void* piyasaya sürülmüş. İkinci satırda adresini içerir d dönüştürdükten sonra const void* piyasaya sürülmüş. Üçüncü satır değeri gösterir nullptr Boş bir işaretçiyi temsil eden çıktı.
İşte programın çıktısı:
Yorum satırını etkinleştirdiğinizde uzun bir hata mesajı alıyorsunuz.
C++26
C++26 ile işaretçiyi doğrudan görüntüleyebilirsiniz:
// formatPointer26.cpp
#include <format>
#include <iostream>
#include <string>
int main() {
double d = 123.456789;
double* p = &d;
std::cout << "&d" << std::format("{}", p) << 'n';
}
Açıkçası program derlenemiyor. Bu, C++26 ve önerilen P2510R3 için derleyici desteğiyle çelişir. Bunun neden böyle olduğunu bir sonraki yazımda anlatacağım.
Bir sonraki adım nedir?
Yarışma, C++26 ile kilitsiz veri yapıları için iki ilginç özelliğe sahip olacak: Okuma-Kopyalama Güncellemesi ve Tehlike İşaretçileri.
(Ben)