co_return
- C++ kursu
- İleri seviye
- Ders 69/83
- 5 dk
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
#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
#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
Task compute() { ____ 10; }
Task compute() { co_return 10; }
Açıklama: co_return 10; coroutine'i bitirir ve 10 döndürür.