Почему не было добавлено yield в C ++ 0x?
Я использовал yield во многих моих программах на Python, и этодействительно очищает код во многих случаях. янаписал об этом в блоге и это одна из популярных страниц моего сайта.
C # также предлагает yield - он реализуется через сохранение состояния на стороне вызывающей стороны, через автоматически сгенерированный класс, который хранит состояние, локальные переменные функции и т. Д.
В настоящее время я читаю о C ++ 0x и его дополнениях; и, читая о реализации лямбда-выражений в C ++ 0x, я обнаружил, что это было сделано через автоматически сгенерированные классы, снабженные operator (), хранящими лямбда-код. У меня возник естественный вопрос: они делали это для лямбд, почему они тоже не рассматривали это как поддержку «урожайности»?
Конечно, они могут видеть значение сопрограмм ... поэтому я могу только догадываться, что они думают о реализации на основе макросов (таких какСаймон Тэтэм) в качестве адекватной замены. Они, однако, не по многим причинам: состояние сохраняемого абонента, не реентерабельный, основанный на макросах (одного этого достаточно) и т. Д.
Редактировать: yield
не зависит от сборки мусора, потоков или волокон. Вы можете прочитать статью Саймона, чтобы увидеть, что я говорю о том, что компилятор выполняет простое преобразование, такое как:
int fibonacci() {
int a = 0, b = 1;
while (true) {
yield a;
int c = a + b;
a = b;
b = c;
}
}
В:
struct GeneratedFibonacci {
int state;
int a, b;
GeneratedFibonacci() : state (0), a (0), b (1) {}
int operator()() {
switch (state) {
case 0:
state = 1;
while (true) {
return a;
case 1:
int c = a + b;
a = b;
b = c;
}
}
}
}
Вывоз мусора? Нет темы? Волокна? Простое преобразование? Возможно, да.