为什么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)。
以下摘自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)。