Почему не было добавлено 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;
            }
        }
    }
}

Вывоз мусора? Нет темы? Волокна? Простое преобразование? Возможно, да.

Ответы на вопрос(8)

Ваш ответ на вопрос