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

Why does C++11 define a non-existing value as a default value?

以下摘自cppreference link 1 and cppreference 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

?

0 您的枚举类型的有效值。根据语言标准枚举类型,其基础类型不固定(您的情况)可以表示在 bit-field 中可表示的所有整数值足够宽度(足以表示所有 named 枚举成员你宣布)。事实上,您有时需要显式转换以将所有这些值强制转换为该枚举类型,这只是带来了一点不便。这意味着 0 是任何枚举类型的有效值。

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