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

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

本文关键字:定义 默认值 不存在 为什么      更新时间:2023-10-16

以下摘录摘自cppReference链接1和cppReference链接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 是您的枚举类型的有效值。根据语言标准枚举类型,其基本类型未固定(您的情况)可以表示所有可在足够宽度的位表示的整数值(足以表示您声明的所有 nem> num num em> enum成员)。您有时需要明确的演员将所有这些价值施加到该枚举类型的事实只是不便。这意味着0是任何枚举类型的有效值。

枚举是一组可以组合的位标志(通过位置操作),而不是独立选择的值。零值意味着标志都不是活跃的(这使其成为大的endian,并且不会消耗或生成bom)。