I have had runtime error, when replaced some code by using std::optional:
Old code:
T getValue(); ... const auto& value = getValue(); value.get(); New code:
std::optional<T> getValue(); ... const auto& value = getValue().value(); value.get(); // Runtime error, crash It was unpredictable for me. The reason of crash is that the method returns T&&.
My question is in what cases T&& can be useful, why the method does not return a T.
Complete code:
#include <experimental/optional> #include <iostream> #include <memory> struct Value { std::unique_ptr<int> a = std::make_unique<int>(5); }; std::experimental::optional<Value> getValue() { Value v; return v; } int main() { const Value& value = getValue().value(); std::cout << *value.a << std::endl; return 0; }
/*const*/T&BTW.Twould do one extramove.