C++26'ya genel bakış: kütüphane

Adanali

Active member
C++26'ya genel bakış: kütüphane


  1. C++26'ya genel bakış: kütüphane

C++26'nın çekirdek dili hakkındaki yorumlarımda da belirttiğim gibi, C++26 tasarımının dondurulması yalnızca 2025'in ilk çeyreğinde gerçekleşeceğinden, kütüphane hakkında yalnızca ilk izlenimi verebilirim. Uzun lafın kısası, kütüphane çekirdek dil kadar güçlü özellikler sunmuyor. Kod örnekleri tekliflerden gelir.


Duyuru








Rainer Grimm uzun yıllardır yazılım mimarı, ekip ve eğitim yöneticisi 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.













std::string- VE std::string_view-işleme


Etrafındaki işlevler std::string VE std::string_view bu özelliklerin kullanımını daha rahat hale getirin.

Başarı veya başarısızlık testicharconv>-karakter işlevleri


İşlevleri kullanma to_chars VEYA from_chars şu ana kadar oldukça karmaşıktı. Bizimle gelmeliydin res.ec == std::errc{} dönüşümün başarısını doğrulayın. C++26 ile sonuç azaltılır bool dönüştürmek.

Aritmetik aşırı yüklemeler std::to_string ve kullanımı std::format


std::to_string bazı sorunları gündeme getiriyor: “kayan nokta formatının seçimi std::to_string'in pratikte çok sınırlı kullanımını sağlare” (yayınlanmış öneri P2587R3).


auto loc = std::locale("uk_UA.UTF-8");
std::locale::global(loc);
std::cout.imbue(loc);
setlocale(LC_ALL, "C");

std::cout << "iostreams:n";&#13;
std::cout << 1234 << "n";&#13;
std::cout << 1234.5 << "n";&#13;
&#13;
std::cout << "nto_string:n";&#13;
std::cout << std::to_string(1234) << "n";&#13;
std::cout << std::to_string(1234.5) << "n";&#13;
&#13;
setlocale(LC_ALL, "uk_UA.UTF-8");&#13;
&#13;
std::cout << "nto_string (uk_UA.UTF-8 C locale):n";&#13;
std::cout << std::to_string(1234) << "n";&#13;
std::cout << std::to_string(1234.5) << "n";


Yukarıdaki listedeki program, iostream'ler için kayan nokta aşırı yüklemelerinin çıktısının tutarsız olduğunu göstermektedir. Ondalık noktasını küresel yerel C'den alır.

Dize akışlarını bağlama std::string_view


P2495R3 önerisi sayesinde, bir dize akışı oluşturmak mümkündür. std::string_view yaratılacak. Aşağıdaki örnekte ""sv boş bir tane string_view– gerçek.


// implicitly convertable to string_view&#13;
const mystring str;&#13;
&#13;
stringstream s1(""sv);&#13;
stringstream s1(str);&#13;
s2.str(""sv);


Dize birleştirme ve dize görüntüleri


C++26 dize birleştirmeye ve dize görünümlerine izin verir.


std::string calculate(std::string_view prefix)&#13;
{&#13;
return prefix + get_string(); // NO ERROR&#13;
}


Uzantıları biçimlendir

işaretçi


C++26'dan önceki eski C++ sürümlerinde yalnızca veri türleri void, const void VE std::nullptr_t geçerli. Bir işaretçinin adresi temsil edilecekse, içinde olmalıdır. std::string calculate(std::string_view prefix) { return prefix + get_string(); // NO ERROR } dönüştürülebilir.


double d = 123.456789;&#13;
std::format("{}", &d); // ERROR&#13;
std::format("{}", static_cast<void*>(&d)); // okay&#13;
std::format("{}", static_cast<const void*>(&d)); // okay&#13;
std::format("{}", nullptr); // okay&#13;



C++26 ile hata mesajları kayboluyor.


// pointerFormat.cpp&#13;
&#13;
#include <format>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
double d = 123.456789;&#13;
&#13;
std::cout << std::format("{}", static_cast<void*>(&d)) << 'n';&#13;
std::cout << std::format("{}", static_cast<const void*>(&d)) << 'n';&#13;
std::cout << std::format("{}", nullptr) << 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


Program çıktısı daha sonra şöyle görünecektir:








std::filesystem::path


std::format Şekerler std::filesystem::path-Nesneleri göster – P2845R8 teklifi örneğinin gösterdiği gibi:


auto p1 = std::filesystem::path("/usr/bin");
Ja std::cout << std::format("{}", p1); // /usr/bin


auto p2 = std::filesystem::path("multinline");
std::cout << std::format("{}", p2); // multi
// line


auto p3 = std::filesystem::path("multinline");
std::cout << std::format("{:?}", p3); // "multinline"



Biçim dizesi sayesinde "{:?}" son satır kaçış dizisidir "n" yorumlanmadı.

std::inplace_vector


std::inplace_vector P0843R8 önerisine göre, “derleme zamanında sabit bir kapasiteye ve öğelerin vektör nesnesinin kendisinde depolandığı bitişik gömülü belleğe sahip, dinamik olarak ayarlanabilir bir vektördür” (“derleme zamanında sabit kapasiteye ve öğelerin vektör nesnesinin kendisinde depolandığı bitişik yerleşik depolamaya sahip, dinamik olarak yeniden boyutlandırılabilir bir vektör“).

Bu konteyner doğrudan yedek olarak kullanılabilir std::vector Kullanılacak. Ama ne zaman olmalı? inplace_vector VEYA vector kullanılacak mı?

P0843R8 teklifine bir bakış, cevabı sağlar:

  • Bellek tahsisi mümkün değil, örn. B. yalnızca bir yığının ve statik bellek bölümünün mevcut olduğu, boş belleğin olmadığı gömülü ortamlarda.
  • Bellek tahsisi performans üzerinde kabul edilemez bir etkiyi temsil eder; B. gecikme açısından,
  • Statik bellek bölümünde karmaşık yaşam süresine sahip nesnelerin tahsisi gereklidir,
  • std::array bir seçenek değil, ör. B. standart dışı inşa edilebilir nesnelerin saklanması gerektiğinde,
  • içinde dinamik olarak ayarlanabilen bir dizi constexpr-Gerekli işlevler
  • konumu olmalı inplace_vector-İçindeki eşyalar inplace_vector-Nesnenin kendisi yalan söyler (örn. desteklemek için) memcpy serileştirme amacıyla).
Menzil iyileştirmeleri


Aralık kitaplığı yeni özellikler kazanıyor: std::ranges::generate_random VE std::ranges::concat_view.

çağrı std::ranges::generate_random(fltArray, g, d) jeneratörü kullan g ve dağıtım dRastgele sayılar üretmek için. Çağrı aşağıdaki döngüye eşdeğerdir:


for(auto& el : fltArray)&#13;
el = d(e);&#13;



constexpr-Uzantılar


C++11'den bu yana bir trend devam etti: C++'da giderek daha fazla işlev çağrısı yapılıyor constexpr.

  • std::stable_sort, std::stable partition VE std::inplace_merge Bunlar C++26'dadır constexpr. Bu aynı zamanda aralık kitaplığındaki karşılıkları için de geçerlidir.
  • Teklif P1383R2 şunları belirtmektedir: “Bu öneri, constexpr'in (daha fazla) liberal bir şekilde serpilmesi anlamına gelir. biraz da olsa “.
Bir sonraki adım nedir?


Bir sonraki yazımda C++26 kütüphanesindeki yolculuğuma devam edeceğim.


(harita)
 
Üst