一、C++14 的新特性
- std::make_unique
作用:更方便地创建 unique_ptr(独占式智能指针)。
以前只能用 std::unique_ptr(new T(...)),现在可以直接用 make_unique。
cpp
// 以前
std::unique_ptr<int> p1(new int(42));
// C++14
auto p2 = std::make_unique<int>(42); // 更安全、更简洁
💡 好处:避免忘记 delete,而且异常安全。
- 标准库支持读写锁(shared_mutex 和 shared_lock)
作用:允许多个线程同时读,但只有一个线程写。适合"读多写少"的场景。
cpp
std::shared_mutex mtx;
// 读锁:多个线程可以同时持有
std::shared_lock read_lock(mtx);
// 写锁:独占
std::unique_lock write_lock(mtx);
- std::exchange
作用:原子地用一个新值替换一个对象,并返回原值(一步完成)。
cpp
int a = 10;
int old = std::exchange(a, 20);
// old == 10, a == 20
常用于移动赋值、交换指针等。
- 原始字符串字面量 R"(...)"
作用:不用再转义字符串里的引号和反斜杠,写起来更干净。
cpp
// 普通字符串要转义
std::string s1 = "C:\\Program Files\\"abc\"";
// 原始字符串:R"delimiter(内容)delimiter"
std::string s2 = R"(C:\Program Files\"abc")";
std::cout << s2; // 输出 C:\Program Files\"abc"
- 二进制字面量 0b01011101
作用:直接写二进制数字,方便位运算。
cpp
int mask = 0b00001111; // 15
int val = 0b1010; // 10
以前只能用十六进制 0x0F 或十进制 15,现在可以直接写二进制位。
- 数字分隔符 ' (单引号)
作用:让大数字更容易阅读,编译器会自动忽略单引号。
cpp
int million = 1'000'000; // 1000000
int magic = 0b1111'0000'1010; // 二进制分组
二、C++17 的新特性
- if 和 switch 里可以直接初始化变量
作用:把变量的作用域限制在 if/switch 内部,代码更清晰。
cpp
// 以前
{
int* p = get_ptr();
if (p != nullptr) {
// 使用 p
}
}
// C++17
if (int* p = get_ptr(); p != nullptr) {
// 使用 p,p 只在这个 if 里有效
}
switch 也一样:
cpp
switch (Status s = get_status(); s) {
case OK: ... break;
case ERR: ... break;
}
- std::string_view
作用:一个"只读的字符串视图",不拷贝数据,只指向原有字符串的一部分。性能高,内存小。
cpp
std::string s = "hello world";
// 以前:传 string 会拷贝,传 const char* 不方便
// C++17:string_view 只保存指针和长度
std::string_view sv = s; // 不拷贝
std::string_view part = s.substr(6, 5); // 指向 "world",不产生新字符串
💡 使用场景:函数参数、字符串切割。注意:string_view 不管理生命周期,原字符串销毁后它就失效了。