Returning a certain lambda wrapped as an std::function produces wrong results:
#include <functional>
#include <iostream>
#include <tuple>
template <typename T>
std::function<const T&()> constant(const T& c) {
return [c]() noexcept -> const T&{ return c; };
}
template <typename T>
std::function<std::tuple<T>()> zip(const std::function<T()>& f) {
return [f]() { return std::tuple{f()}; };
}
int main() {
const auto good = [f = constant(1.0)]() { return std::tuple{f()}; };
const auto bad = zip(constant(1.0));
std::cout << "good: " << std::get<0>(good()) << std::endl;
std::cout << "bad: " << std::get<0>(bad()) << std::endl;
}
Output:
$ ./a.out
good: 1
bad: 6.95282e-310
It looks like undefined behaviour. What is going on?