C++语言的演进不断带来强大的新特性,提升了代码的安全性、可读性和可维护性。在这些改进中,我们见证了从 C++17、C++20 到 C++23 中对 enum class 功能的修改和扩展。在这篇文章中,我们将探讨这些进展,重点介绍 C++17 中的初始化改进、C++20 中引入的 using enum 关键字,以及 C++23 中的 std::to_underlying 实用工具。1、enum class 简介在深入了解这些改进之前,让我们先简要回顾一下 enum class 是什么。enum class(限定作用域的枚举)提供了一种类型安全的方式来定义一组命名常量。与传统的(无作用域)枚举不同,enum class 不会隐式转换为整数或其他类型,从而防止了意外的误用。下面是一个基本示例:#include <iostream>
enum class Color { Red, Green, Blue};
int main() { Color color = Color::Red;
if (color == Color::Red) std::cout << "The color is red.\n";
color = Color::Blue;
if (color == Color::Blue) std::cout << "The color is blue.\n";
// std::cout << color; // error, no matching << operator // int i = color; // error: cannot convert}注意,在 main 函数的末尾有两行代码。由于没有隐式转换为整数类型,因此会出现编译器错误。作为对比,下面是一个类似的例子,但使用的是无作用域枚举:#include <iostream>
enum Color { Red, Green, Blue};
int main() { Color color = Red;
if (color == Red) std::cout << "The color is red.\n";
color = Blue;
if (color == Blue) std::cout << "The color is blue.\n";
std::cout << color; // fine, prints integer value! int i = color; // fine, can convert...}简而言之,enum class 为所有枚举值提供了单独的作用域,同时也加强了类型安全。没有隐式的整数转换,这样你就能更好地控制设计。以上的基础部分很简单,接下来让我们来看看最新 C++ 版本中的一些实用改进。 |
|