The realization of expected<T>
in this blog has a bug. While using it I've write a code like follows:
expected<double> my_sqrt(double x) { if(x < 0) return expected<int>::from_exception(std::out_of_range("x")); return std::sqrt(x); }; int main() { std::cout << *sqrt(-10) << std::endl; };
You may suspect that the first variant of my_sqrt
was returning expected<int>
and I've just forgot to change types everywhere. I've gotten "0" instead of "Terminate called after...". There was called a ctor expected<double>::expected(AA... arguments)
which had taken an instance of expected<int>
as an argument and succeeded.
To avoid such mistakes following code should be added to expected<T>
(not expected_common<T>
):
template<typename U> expected(expected<U>) = delete;
No comments:
Post a Comment