为什么读

用比较短的篇幅把C++11到C++20的内容系统了解一下。
这本书的中文版的电子版没有找到,被迫买了实体版。

章节

  1. 基础
  2. 用户自定义类型
  3. 模块化
  4. 错误处理
  5. 基本操作
  6. 模板
  7. 概念和泛型编程
  8. 标准库
  9. 字符串和正则表达式
  10. 输入和输出
  11. 容器
  12. 算法
  13. 范围
  14. 指针与容器
  15. 实用工具
  16. 数值计算
  17. 并发
  18. 历史与兼容性
  19. 附录A std模块

基础

最新最时髦的Hello, World!

import std;
 
int main() {
	std::cout << "Hello, World!\n";
}

在我2024年末的这个时间点,要在vs2022的项目属性里设置“C++语言标准: /std:c++latest”和“生成ISO C++23 标准库模块:是”才能成功编译运行。

数字字面量分隔符

int x = 2'147'483'647;

隔壁js用的是下划线x = 1_000_000

用户自定义类型

可以用std::variant代替union,里面保存了实际使用的类型。

模块化

写一个模块

// Vector.ixx
export module Vector;
 
export class Vector {
public:
	Vector(int s);
	double& operator[](int i) const;
	int size() const;
private:
	double* elem;
	int sz;
};
 
Vector::Vector(int s) : elem{new double[s]}, sz(s) {
 
}
 
double& Vector::operator[](int i) const {
	return elem[i];
}
 
int Vector::size() const {
	return sz;
}
 
export bool operator==(const Vector& v1, const Vector& v2) {
	if (v1.size() != v2.size()) {
		return false;
	}
	for (int i = 0; i < v1.size(); i++) {
		if (v1[i] != v2[i]) {
			return false;
		}                                                                                  
	}
	return true;
}

使用模块

import std;
import Vector;
int main() {
	Vector v{ 3 };
	std::cout << v.size() << "\n";
}

返回类型后置

建议别用

auto sqrt(double) -> double;

结构化绑定

struct Entry {
	string name;
	int value;
};
Entry read_entry();
// ...
auto [n,v] = read_entry();

遍历map

map<string, int> m;
for (const auto [key, value] : m) {
	// ...
}