CodeBlanks Logo Icon CodeBlanks

std::expected

std::expected ile hata yönetimini öğrenirsin.

std::expected nedir?

std::expected<T, E>, C++23 ile gelen bir türdür: ya bir T değeri ya da bir E hatası tutar. İstisna fırlatmak yerine hatayı dönüş değeri olarak verir.

Örnek: std::expected<int, std::string> divide(int a, int b). Başarıda return a / b;, hatada return std::unexpected(std::string("sıfıra bölme"));. Çağıran r.has_value() ile durumu kontrol eder, r.value() ile değeri, r.error() ile hatayı alır. Bu, istisna maliyetini olmadan hata yönetimi sağlar; özellikle gerçek hata (exception) ile beklenen durum (expected failure) ayrımı için kullanışlıdır.

value() ve error()

Bir std::expected nesnesinden değeri .value() ile, hatayı .error() ile alırsın. .has_value() önce kontrol edilmelidir.

Örnek: auto r = divide(10, 2); if (r.has_value()) std::cout << r.value(); else std::cout << r.error();. Eğer değer yokken .value() çağırırsan istisna fırlatılır. Bu yüzden önce has_value() ile denetlemek gerekir. std::unexpected ile hata üretilir: return std::unexpected(std::string("hata"));. Bu, açık ve tip-güvenli bir hata yönetimidir.

Uygulama divide fonksiyonunu std::expected ile yaz

std::expected<int, std::string> divide(int a, int b) fonksiyonunu yaz: b == 0 ise return std::unexpected(std::string("sıfıra bölme"));, değilse return a / b;. main içinde divide(10, 2) çağır; has_value() true ise value()'u, değilse error()'u std::cout ile yaz.

Başlangıç kodu

main.cpp
#include <iostream>
#include <expected>
#include <string>

// divide fonksiyonunu std::expected ile yaz

int main() {
    // divide çağır ve sonuçu yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <expected>
#include <string>

std::expected<int, std::string> divide(int a, int b) {
    if (b == 0) return std::unexpected(std::string("sıfıra bölme"));
    return a / b;
}

int main() {
    auto r = divide(10, 2);
    if (r.has_value()) std::cout << r.value();
    else std::cout << r.error();
    return 0;
}

Beklenen çıktı

5

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 std::expected ne zaman kullanılır?

  • Her zaman istisna yerine
  • Çoklu iş parçacığı için
  • Yalnızca bellek hataları için
  • Beklenen hata durumlarını değer olarak döndürmek için Doğru cevap

Açıklama: std::expected, beklenen hataları istisna yerine değer olarak döndürür.

2 Üyeyi rolüne eşle

Kavram Anlamı
has_value Değer var mı?
value() Değeri al
error() Hatayı al
std::unexpected Hata üretir

3 .value() çağrısı

Soru
if (r.has_value()) std::cout << r.____();
Cevap
if (r.has_value()) std::cout << r.value();

Açıklama: r.value() başarılı sonuçu döndürür.

İleri seviye bölümündeki tüm dersler