cpp11 cpp17 cpp20 的区别
时间: 2023-05-27 13:05:56 浏览: 106
C++11、C++17、C++20 都是 C++ 标准的版本,它们之间的区别如下:
1. C++11:C++11 引入了许多新特性,如 lambda 表达式、右值引用、智能指针、constexpr 函数、委托构造函数、range-based for 循环、默认和删除函数、nullptr 关键字、static_assert 关键字等。
2. C++17:C++17 在 C++11 的基础上增加了一些新特性,如结构化绑定、if constexpr、折叠表达式、内联变量、constexpr if、inline namespace、容器改进等。
3. C++20:C++20 是最新的 C++ 标准,增加了许多新特性,如概念、协程、三位运算符优先级改变、初始化语句中的声明、常量表达式的改进、constinit、迭代器范围的改进、std::span、std::format 等。
总的来说,C++11、C++17、C++20 的特性都在逐步完善 C++ 语言本身和标准库,提高了 C++ 的可用性和效率,使得开发者更容易编写高质量的代码。
相关问题
cpp11的 foreach 循环
C++11引入了foreach循环,又称为范围for循环,它可以遍历一个范围内的元素,如数组、容器等。
foreach循环语法如下:
```cpp
for (auto &element : range) {
// 循环体
}
```
其中,`range`是一个范围,可以是数组、容器等,`element`是一个临时变量,用于遍历`range`中的元素,`&`表示`element`是一个引用,可以修改遍历到的元素。
例如,遍历一个数组:
```cpp
int arr[] = {1, 2, 3, 4, 5};
for (auto &x : arr) {
std::cout << x << " ";
}
// 输出:1 2 3 4 5
```
遍历一个vector:
```cpp
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto &x : vec) {
std::cout << x << " ";
}
// 输出:1 2 3 4 5
```
需要注意的是,如果`range`是一个常量,那么`element`需要使用常量引用:
```cpp
const int arr[] = {1, 2, 3, 4, 5};
for (const auto &x : arr) {
std::cout << x << " ";
}
// 输出:1 2 3 4 5
```
cpp11Null 指针常量
在C++11中,可以使用关键字`nullptr`来表示空指针常量。`nullptr`是一个特殊的关键字,表示一个空指针常量。在C++11之前,通常使用`NULL`宏来表示空指针常量,但这种方式容易出现类型转换错误,因为`NULL`宏实际上是一个整数常量,而不是一个真正的指针常量。使用`nullptr`可以避免这种类型转换错误的问题。例如:
```cpp
int *p = nullptr; // p是一个空指针
```
需要注意的是,`nullptr`只能用于指针类型,不能用于整数类型。如果需要将`nullptr`转换为整数类型,需要使用`reinterpret_cast`或者`static_cast`。例如:
```cpp
int *p = nullptr;
int i = reinterpret_cast<int>(p); // 将空指针转换为整数类型
```