The following compiles fine:
#include <functional>
int main()
{
std::function<const int&()> f = []() -> int {return 1;};
const int& r = f(); // r is a dangling reference
return 0;
}
How come it's possible to set an std::function
with a const int&
return type to a lambda with an int
return type? Allowing this sort of cast to happen implicitly and with no warning is a gotcha IMHO.
You can construct a std::function
with any object which is callable with the relevant arguments and whose return value is implicitly convertible to the std::function
return. int
is implicitly convertible to const int&
, so the rules are met.
A compiler could feel free to warn about this, but it seems like a lot of work for a particularly corner-y corner case.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With