开个做网站的公司 知乎wordpress关键词添加
2026/3/24 11:40:20 网站建设 项目流程
开个做网站的公司 知乎,wordpress关键词添加,网站建设兼职薪酬怎么样,怎么做网站策划使用限域enum来减少命名空间污染 通用规则#xff1a;如果在一对大括号里声明一个名字#xff0c;则该名字的可见性限定在括号括起来的作用域内。 但这个规则不适用于 C98 风格的枚举类型中定义的枚举变量#xff1a;枚举变量的属于包含着这个枚举类型的作用域#xff0c…使用限域enum来减少命名空间污染通用规则如果在一对大括号里声明一个名字则该名字的可见性限定在括号括起来的作用域内。但这个规则不适用于 C98 风格的枚举类型中定义的枚举变量枚举变量的属于包含着这个枚举类型的作用域此作用域内不能有其他实体取相同的名字。enum Color { black, white, red }; //black, white, red在Color所在的作用域 auto white false; //错误! white早已在这个作用域中声明枚举量的名字泄露到枚举类型所在作用域的现象被称为不限范围的枚举类型未限域enum。在 C11 中限定作用域的枚举类型枚举类 / 限域enum不会以这样的方式泄露名字enum class Color { black, white, red }; //black, white, red限制在Color域内 auto white false; //没问题域内没有其他“white” Color c white; //错误域中没有枚举名叫white Color c Color::white; //没问题 auto c Color::white; //也没问题也符合5的建议限域枚举的枚举量是强类型的强类型语言会对类型兼容性做严格检查禁止隐式的、不安全的类型转换每个值都有明确且固定的类型类型错误会被尽可能早地捕获编译器 / 运行期。不限域枚举类型的枚举量可以隐式转换为整数类型并能够从此处进一步转换到浮点类型导致语义扭曲的代码合法enum Color { black, white, red }; //未限域enum std::vectorstd::size_tprimeFactors(std::size_t x); //func返回x的质因子 Color c red; if (c 14.5) { // Color与double比较 (!) auto factors primeFactors(c); // 向std::size_t参数传递Color (!) … }从限定作用域的枚举类型到任何其他类型都不存在隐式转换路径类型安全更优enum class Color { black, white, red }; //Color现在是限域enum Color c Color::red; if (c 14.5) { //错误不能比较Color和double auto factors primeFactors(c); //错误不能向std::size_t参数传Color … } // 仅显式强制转换才允许可控的类型转换 if (static_castdouble(c) 14.5) { auto factors primeFactors(static_caststd::size_t(c)); }限定作用域的枚举类型可以进行前置声明前置声明的核心前提是编译器能确定枚举的底层类型内存大小enum Color; // 错误未限域enum无默认底层类型编译器无法推断内存大小 enum class Color; // 没问题限域enum默认底层类型为int内存大小确定底层类型与前置声明的完整规则所有enum的底层类型是编译器为优化内存选择的整型需覆盖所有枚举值的最小类型限域enum默认底层类型为int也可显式指定因此总能直接前置声明enum class Status; // 默认int合法 enum class Status: std::uint32_t; // 显式指定底层类型合法未限域enum无默认底层类型仅显式指定底层类型时才能前置声明enum Color: std::uint8_t; // 显式指定底层类型合法两者均可在定义时显式指定底层类型enum class Status: std::uint32_t { good 0, failed 1 }; enum Color: std::uint8_t { black, white, red };未限域枚举的唯一实用场景简化std::tuple字段访问限域enum虽类型安全但访问std::tuple字段时因无隐式转换代码冗长未限域enum可利用 “隐式转换为std::size_t” 简化模板实参传递// 定义tuple类型存储用户名、邮箱、声望值 using UserInfo std::tuplestd::string, std::string, std::size_t; // 未限域enum简洁访问tuple字段依赖隐式转换为std::size_t enum UserInfoFields { uiName, uiEmail, uiReputation }; UserInfo uInfo; auto val std::getuiEmail(uInfo); // 直接用枚举成员作为模板实参 // 限域enum无隐式转换代码冗长 enum class UserInfoFields { uiName, uiEmail, uiReputation }; auto val std::getstatic_caststd::size_t(UserInfoFields::uiEmail)(uInfo);限域枚举访问 tuple 的优化方案toUType constexpr 函数模板为兼顾限域enum的类型安全与tuple访问的简洁性可实现编译期生效的toUType函数模板转换枚举值为其底层类型C11 版本templatetypename E constexpr typename std::underlying_typeE::type toUType(E enumerator) noexcept { return static_casttypename std::underlying_typeE::type(enumerator); }C14 简化版本更简洁templatetypename E constexpr auto toUType(E enumerator) noexcept { return static_caststd::underlying_type_tE(enumerator); }调用方式兼顾安全与简洁auto val std::gettoUType(UserInfoFields::uiEmail)(uInfo);总结C98风格的枚举类型称为不限范围的枚举类型。限定作用域的枚举类型仅在枚举类型内可见。它们只能通过cast强制类型转换以转换至其他类型。限定作用域的枚举类型和不限范围的枚举类型都支持底层类型指定。限域的枚举类型的默认底层类型是int而不限域的枚举类型没有默认底层类型。限定作用域的枚举类型总是可以进行前置声明而不限域的枚举类型却只有在指定了默认底层类型的前提下才可以进行前置声明。原著在线阅读地址

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询