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();
}

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

2

Решение

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]