为什么C++ 11将不存在的值定义为默认值?

xml*_*lmx 1 c++ standards language-design default-value c++11

以下摘录自cppreference链接1cppreference链接2:

enum codecvt_mode
{
    consume_header = 4,
    generate_header = 2,
    little_endian = 1
};

template
<
    class Elem,
    unsigned long Maxcode = 0x10ffff,
    std::codecvt_mode Mode = (std::codecvt_mode)0
>
class codecvt_utf8_utf16 : public std::codecvt<Elem, char, std::mbstate_t>;
Run Code Online (Sandbox Code Playgroud)

显然,0枚举类型的定义不明确codecvt_mode.C++标准可能会故意保留实现定义的默认值.

但是,我认为实现定义的默认值对用户来说可能是模糊的.

为什么C++ 11定义

std::codecvt_mode Mode = (std::codecvt_mode)0

而不是

std::codecvt_mode Mode = std::little_endian

AnT*_*AnT 6

0 枚举类型的有效值.根据语言标准枚举类型,其基础类型不固定(您的情况)可以表示在足够宽度的位域中可表示的所有整数值(足以表示您声明的所有命名枚举成员).你有时需要一个显式强制转换来强制所有这些值进入枚举类型的事实只是一点点不便.这意味着它0是任何枚举类型的有效值.


Sha*_*ger 5

枚举是一组可以组合的位标志(通过按位运算),而不是独立选择的值.值为零表示没有任何标志处于活动状态(这使得它成为大端,并且不消耗或生成BOM).