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

时间:2017-02-15 04:17:43

标签: c++ c++11 standards default-value language-design

以下内容摘自cppreference link 1cppreference link 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>;

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

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

为什么C ++ 11定义

  

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

而不是

  

std::codecvt_mode Mode = std::little_endian

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

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