CodeBlanks Logo Icon CodeBlanks

co_return

co_return ile coroutine dönüşünü öğrenirsin.

co_return nedir?

co_return, bir coroutine'i bitirir ve değer döndürür. Normal return yerine coroutine'lerde kullanılır. co_return v;, promise'ın return_value(v) üyesini çağırır.

Değer döndürmeyen bitirme için co_return; (boş) kullanılır; bu, return_void() üyesini çağırır. Bir coroutine ya co_return ile biter ya da gövdesinin sonuna ulaşır. return anahtar sözcüğü coroutine içinde kullanılamaz; onun yerine co_return yazılır.

promise_type::return_value

Bir coroutine co_return v; ile bittiğinde, promise'ın return_value(v) üyesi çağrılır. Bu üye, dönecek değeri saklamak için kullanılır.

Örnek: void return_value(int v) { value_ = v; }. Burada değer, value_ üyesine yazılır. Coroutine bittikten sonra, handle.promise().value_ ile bu değeri okuyabilirsin. Böylece coroutine'in sonuçu, dışarıdan tip-güvenli biçimde alınır. final_suspend eğer suspend_always döndürürse, çerçeve yaşar ve değer okunabilir.

Uygulama co_return ile değer döndür

compute coroutine'inin gövdesine co_return 10; yaz. main içinde compute() çağrısının sonucundan promise().value_ ile değeri al ve std::cout ile yaz.

Başlangıç kodu

main.cpp
#include <iostream>
#include <coroutine>

struct Task {
    struct promise_type {
        int value_;
        Task get_return_object() { return {std::coroutine_handle<promise_type>::from_promise(*this)}; }
        std::suspend_never initial_suspend() { return {}; }
        std::suspend_always final_suspend() noexcept { return {}; }
        void return_value(int v) { value_ = v; }
        void unhandled_exception() { }
    };
    std::coroutine_handle<promise_type> handle;
};

Task compute() {
    // co_return ile 10 döndür
}

int main() {
    // compute çağır ve değeri yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <coroutine>

struct Task {
    struct promise_type {
        int value_;
        Task get_return_object() { return {std::coroutine_handle<promise_type>::from_promise(*this)}; }
        std::suspend_never initial_suspend() { return {}; }
        std::suspend_always final_suspend() noexcept { return {}; }
        void return_value(int v) { value_ = v; }
        void unhandled_exception() { }
    };
    std::coroutine_handle<promise_type> handle;
};

Task compute() {
    co_return 10;
}

int main() {
    auto t = compute();
    std::cout << t.handle.promise().value_;
    return 0;
}

Beklenen çıktı

10

Soru ve cevaplar

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

1 İfadesi rolüne eşle

Kavram Anlamı
co_return 42; Değerli bitirme
co_return; Değersiz bitirme
return_value Değeri saklar
return_void Boş bitirir

2 co_return ile return arasındaki fark nedir?

  • co_return, coroutine içinde kullanılır; return kullanılamaz Doğru cevap
  • return daha hızlıdır
  • co_return yalnızca void döndürür
  • İkisi arasında fark yoktur

Açıklama: Bir coroutine içinde return kullanılamaz; onun yerine co_return yazılır.

3 co_return ifadesi

Soru
Task compute() { ____ 10; }
Cevap
Task compute() { co_return 10; }

Açıklama: co_return 10; coroutine'i bitirir ve 10 döndürür.

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