Why is C++ numeric_limits::max() == 0?

前端 未结 4 802
忘了有多久
忘了有多久 2021-01-04 06:22

Here\'s a bit of code that might seem like it would work:

#include 
#include 

enum test { A = 1 };

int main()
{
    int max =          


        
相关标签:
4条回答
  • 2021-01-04 07:03

    The numeric_limits<T> is a regular class template, it is not connected to the compiler in any special way as to find out about user-defined enum types. If you look at the <limits> file, it has the default template definition that returns zeros for everything, and a whole bunch of type-specific specifications for the individual types, returning the right constants.

    You can "plug in" your enum into numeric_limits by providing a specification of numeric_limits<test> by yourself. You can copy the one for int from the <limits>, and modify it to suit your needs.

    0 讨论(0)
  • 2021-01-04 07:06

    From the C++11 draft:

    In 18.3.2.1, about numeric_limits:

    Non-arithmetic standard types, such as complex (26.4.2), shall not have specializations.

    And an enum is not an arithmetic standard type.

    Then, in the non-specialized template:

    template<class T> class numeric_limits {
        public:
        [...]
        static constexpr bool is_specialized = false;
        static constexpr T max() noexcept { return T(); }
    };
    

    That is, the non-specialized max() function returns the default initialized value for that type, that is 0.

    0 讨论(0)
  • 2021-01-04 07:07

    For non-specialized versions of the template, max returns T(). You have not written a numeric_limits specialization for your test type, so you get the default implementation.

    0 讨论(0)
  • 2021-01-04 07:11

    std::numeric_limits is specialized in the Standard Library "for each arithmetic type, both floating point and integer, including bool" (§18.3.2.1/2).

    Your enumeration test is not one of these types, so the primary template is used. Its behavior is specified by §18.3.2.3/1: "The default numeric_limits<T> template shall have all members, but with 0 or false values."

    If you want to know the traits of the underlying type of test, you can use underlying_type:

    std::numeric_limits<std::underlying_type<test>::type>::max()
    

    Alternatively, you can specialize numeric_limits for test and have it return the values you want. This is not a particularly good idea, though.

    0 讨论(0)
提交回复
热议问题