为什么C 11将不存在的值定义为默认值
Why does C++11 define a non-existing value as a default value?
以下摘录摘自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)。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 具有默认值的引用获取函数
- 当给定默认值时,为什么此模板参数推导失败
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 格式化浮点值:返回默认值
- 如何将数组部分初始化为某个默认值?
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- boost::p rogram_options 自定义验证和默认值
- 为什么C 11将不存在的值定义为默认值
- 解析器名称定义为默认值:%start 后"parse"警告野牛
- 在C 中的自定义类的hashmap中的默认值
- 是指针定义行为映射中 nullptr 的默认值
- 如何使用命名变量定义常量右值引用参数的默认值
- 将具有默认值的构造函数定义为组合对象的私有字段
- 当C/C++程序切换语句转到未定义的大小写并且缺少默认值时,它的正确行为是什么:
- 如何使用默认值定义结构
- 类内定义的静态结构的静态成员的编译时默认值
- 为什么 boost::p rogram_options 在定义默认值时会抛出有关必需参数的错误
- 使用提升singleton_pool自定义分配比默认值慢
- 在函数定义中指定参数默认值会导致错误 C2143:语法错误:'='之前缺少')'