Код: Выделить всё
template
coro operator+(A && a, B && b)
{
return [] (A a, B b) -> coro {
var y {a.value() + b.value()};
co_yield y;
a.backward(y.grad());
b.backward(y.grad());
}(std::forward(a), std::forward(b));
}
// OR
template
coro operator+(A && _a, B && _b)
{
A a = std::forward(_a);
B b = std::forward(_b);
var y {a.value() + b.value()};
co_yield y;
a.backward(y.grad());
b.backward(y.grad());
}
Для большего контекста цель — поддержка выражений с временными объектами, например a + b + c, но для захвата временных объектов по значению, чтобы они не висели в сопрограммах. Однако выражения со ссылками lvalue должны не копировать данные, поскольку
они являются узлами в группе обеспечения доступности баз данных, потенциально с другими ссылками.
Я надеюсь есть просто какой-то хитрый трюк с выводом шаблонов или разрешением перегрузок, который может творить всю магию в одном месте, поэтому каждая из моих функций сопрограммы становится тоньше.
Подробнее здесь: https://stackoverflow.com/questions/791 ... not-rvalue
Мобильная версия