Coroutines2 - почему yield работает, когда источник не называется

Я учусь пользоваться библиотекой boost coroutines2. Я прочитал несколько уроков и начал экспериментировать с ними. Но потом я нашел что-то очень запутанное. Пожалуйста, взгляните на этот основной пример.

#include <boost/coroutine2/all.hpp>
#include <iostream>

using namespace std;
typedef boost::coroutines2::coroutine<int> cr;

void creator(cr::push_type& yield)
{
    cout << "First time." << endl;
    yield(1);
    cout << "Second time. " << endl;
    yield(2);
}

int main()
{
    cr::pull_type source{creator};
    source();
}

Результат, естественно, такой:

First time.
Second time. 

Но, к моему удивлению, когда я удаляю вызов "source" в основной функции, результат точно такой же! (Согласно учебным пособиям сопрограмма вызывается впервые во время конструирования, поэтому нормально, что она вызывается, но теперь ее следует вызывать только один раз!)

#include <boost/coroutine2/all.hpp>
#include <iostream>

using namespace std;
typedef boost::coroutines2::coroutine<int> cr;

void creator(cr::push_type& yield)
{
    cout << "First time." << endl;
    yield(1);
    cout << "Second time. " << endl;
    yield(2);
}

int main()
{
    cr::pull_type source{creator};
}

Результат по-прежнему:

First time.
Second time. 

Когда я удаляю второй "yield" в сопрограмме, результат также тот же:

#include <boost/coroutine2/all.hpp>
#include <iostream>

using namespace std;
typedef boost::coroutines2::coroutine<int> cr;

void creator(cr::push_type& yield)
{
    cout << "First time." << endl;
    yield(1);
    cout << "Second time. " << endl;
}

int main()
{
    cr::pull_type source{creator};
}

Результат:

First time.
Second time. 

Как это возможно? Как это работает? Я ожидал, что когда я не вызову сопрограмму, тогда, даже если есть еще один "выход", ничего не произойдет.

И я нахожу также странным это поведение:

Когда я добавляю еще один "исходный" оператор в основной, код все равно печатается так же, как и в начале!

#include <boost/coroutine2/all.hpp>
#include <iostream>

using namespace std;
typedef boost::coroutines2::coroutine<int> cr;

void creator(cr::push_type& yield)
{
    cout << "First time." << endl;
    yield(1);
    cout << "Second time. " << endl;
    yield(2);
}

int main()
{
    cr::pull_type source{creator};
    source();
    source();
}

Результат:

First time.
Second time. 

Никаких ошибок, даже если поиск происходит чаще, чем есть. Только после добавления еще одного "источника" в основную функцию я получаю ошибку времени выполнения (это приложение запросило время выполнения, чтобы завершить его необычным способом...)

int main()
{
    cr::pull_type source{creator};
    source();
    source();
    source();
}

Может ли кто-нибудь помочь мне, пожалуйста, с пониманием этого поведения?

1 ответ

Причина кроется в ошибке в Boost. Я проверил, что в Boost 1.65.1 все отлично работает. Вот доказательство: https://wandbox.org/permlink/pRuSgnwa3VPdqNUk

Другие вопросы по тегам