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