
Hi there,
we have been repeatedly bitten by std::numeric_limits because of its default implementation, i.e., the one beginning with
template<typename _Tp> struct numeric_limits : public __numeric_limits_base { /** The minimum finite value, or for floating types with denormalization, the minimum positive normalized value. */ static _Tp min() throw() { return static_cast<_Tp>(0); } /** The maximum finite value. */ static _Tp max() throw() { return static_cast<_Tp>(0); } /** The @e machine @e epsilon: the difference between 1 and the least value greater than 1 that is representable. */ static _Tp epsilon() throw() { return static_cast<_Tp>(0); } ...
in the <limits> header file (I am looking at GCC version 4.0.2).
Is that default implementation mandated by the standard? If so, well... fine. But if it is not mandated then I think it makes much sense to remove it as it seems a perfect recipe for disaster.
Another issue is: shouldn't, e.g., std::numeric_limits<int> and std::numeric_limits<const int> be completely equivalent? Here is a little C++ program demonstrating what I mean:
#include <limits> #include <iostream>
using namespace std;
struct Foo { Foo(int) { }; operator int() { return 27; } };
int main() { std::cout << std::numeric_limits<Foo>::is_bounded << std::endl; std::cout << std::numeric_limits<Foo>::max() << std::endl;
std::cout << std::numeric_limits<const int>::is_bounded << std::endl; std::cout << std::numeric_limits<const int>::max() << std::endl;
std::cout << std::numeric_limits<int>::is_bounded << std::endl; std::cout << std::numeric_limits<int>::max() << std::endl; }
Here it prints the following:
0 27 0 0 1 2147483647
All the best,
Roberto