C++11 支持的特性与语法大全
一、语言核心特性
1. 自动类型推导
auto关键字让编译器根据初始化表达式自动推导变量类型。
auto x = 42; // int auto y = 3.14; // double auto str = "hello"; // const char*
2. 右值引用和移动语义
右值引用
T&&可以绑定临时对象,支持移动构造和移动赋值。
std::vector<int> v1 = {1,2,3};
std::vector<int> v2 = std::move(v1); // v1被移动配合
std::move()和std::forward()使用,提高性能,减少拷贝。
3. 统一初始化语法(列表初始化)
使用
{}初始化数组、容器、对象。
int a{5};
std::vector<int> v{1,2,3,4};
struct Point { int x, y; };
Point p{10, 20};4. nullptr
替代
NULL,类型安全。
int* p = nullptr;
if(p == nullptr) { /*...*/ }5. 常量表达式
constexpr声明编译期常量函数或变量。
constexpr int square(int x) { return x*x; }
constexpr int val = square(5);6. 强类型枚举
enum class防止枚举值冲突,类型安全。
enum class Color { Red, Green, Blue };
Color c = Color::Red;7. 函数和 lambda 表达式
Lambda 支持匿名函数、捕获外部变量。
auto add = [](int a, int b){ return a + b; };
int result = add(2, 3);支持捕获方式:
int x = 10;
auto f = [x]() { return x + 1; }; // 值捕获
auto g = [&x]() { x++; }; // 引用捕获8. 默认成员函数和删除函数
= default用于显式生成默认构造、拷贝构造等= delete禁止某个函数
struct A {
A() = default;
A(const A&) = delete;
};9. 尾返回类型
使用
auto和->指定返回类型。
auto add(int a, int b) -> int {
return a + b;
}10. 模板改进
别名模板(alias template)
template<typename T> using Vec = std::vector<T>; Vec<int> v; // 等价 std::vector<int>
可变参数模板
template<typename... Args>
void printAll(Args... args) { (std::cout << ... << args); }11. 增强的类型检查
类型推断和检查:
decltype推导表达式类型。
int x = 42; decltype(x) y = x; // y 类型为 int
12. 静态断言
static_assert编译时断言
static_assert(sizeof(int) == 4, "int must be 4 bytes");
13. 右值引用与移动语义支持的标准库改进
std::move,std::forward,std::unique_ptr,std::shared_ptr
二、线程与并发特性
1. 多线程库
std::thread创建线程std::mutex,std::lock_guard互斥std::condition_variable条件变量原子操作
std::atomic<T>
#include <thread>
#include <mutex>
std::mutex mtx;
void print(int i) {
std::lock_guard<std::mutex> lock(mtx);
std::cout << i << std::endl;
}
std::thread t1(print, 1);2. 线程局部存储
thread_local int counter = 0;
三、标准库改进(STL)
1. 智能指针
std::unique_ptr<T>,std::shared_ptr<T>,std::weak_ptr<T>
std::unique_ptr<int> p = std::make_unique<int>(5);
2. 数组和容器增强
std::array<T, N>定长数组std::unordered_map,std::unordered_set哈希容器
3. 正则表达式
#include <regex>
std::regex r("\\d+");
std::smatch m;
std::regex_match("123", m, r);4. 智能迭代器增强
std::begin,std::end,std::cbegin,std::cend
5. 新算法和函数
std::move,std::forward,std::to_string,std::stoi系列
四、其他语法与特性
范围 for 循环
std::vector<int> v{1,2,3};
for(auto x : v) { std::cout << x << " "; }字符串字面量
u8"", u"", U"",支持 UTF-8/16/32
原子类型和内存模型
std::atomic提供原子操作内存序列化:
memory_order_relaxed, memory_order_acquire等
用户字面量
long double operator"" _km(long double x) { return x * 1000; }
auto distance = 1.5_km;五、总结表格(核心特性)
| 特性类别 | 特性示例/语法 | 说明 |
|---|---|---|
| 自动类型 | auto x = 10; | 类型自动推导 |
| nullptr | int* p = nullptr; | 类型安全空指针 |
| Lambda | [x](int y){ return x+y; }; | 匿名函数 |
| 右值引用 | T&&, std::move() | 移动语义 |
| 强类型枚举 | enum class Color{} | 类型安全枚举 |
| 静态断言 | static_assert(cond, "msg") | 编译时断言 |
| 尾返回类型 | auto f() -> int | 指定返回类型 |
| 统一初始化 | int a{5}; | 初始化列表 |
| 智能指针 | std::unique_ptr, std::shared_ptr | 自动管理内存 |
| 线程库 | std::thread, std::mutex | 多线程支持 |
| 正则表达式 | std::regex | 字符串模式匹配 |
| 范围 for | for(auto x: v) | 遍历容器简化 |
| constexpr | constexpr int sq(int x) | 编译期常量 |
| 可变参数模板 | template<typename... Args> | 支持任意参数模板 |
| 用户字面量 | 1.0_km | 自定义常量单位 |
C++11 特性语法对照表
| 类别 | 特性 | 语法示例 | 说明 | 注意事项 |
|---|---|---|---|---|
| 类型推导 | 自动类型推导 | auto x = 42; | 编译器根据初始化表达式推导类型 | 初始化必须存在,否则报错 |
| 空指针 | nullptr | int* p = nullptr; | 替代 NULL,类型安全 | 不能直接赋值为整型 |
| Lambda | 匿名函数 | auto f = [](int a,int b){ return a+b; }; | 支持捕获外部变量 | 捕获引用需注意生命周期 |
| 右值引用 | 移动语义 | T&& t = std::move(obj); | 避免不必要拷贝,提高性能 | 被移动对象状态不确定,不可再用原值 |
| 强类型枚举 | enum class | enum class Color{Red, Green}; | 类型安全,防止命名冲突 | 需要用 Color::Red 访问 |
| 静态断言 | static_assert | static_assert(sizeof(int)==4,"error"); | 编译期检查条件 | 条件必须是编译期可计算 |
| 尾返回类型 | auto + -> | auto f() -> int { return 1; } | 指定函数返回类型 | 主要用于复杂类型推导或模板 |
| 统一初始化 | 列表初始化 | int a{5}; std::vector<int> v{1,2,3}; | 支持数组、对象、容器初始化 | 防止窄化转换(narrowing) |
| 智能指针 | unique_ptr/shared_ptr | std::unique_ptr<int> p = std::make_unique<int>(5); | 自动管理内存,减少内存泄漏 | 注意循环引用问题(shared_ptr + weak_ptr) |
| 多线程 | thread/mutex/condition_variable | std::thread t(func); std::mutex m; std::lock_guard<std::mutex> lock(m); | 提供跨平台多线程支持 | 注意线程同步和资源保护 |
| 范围 for | range-based for | for(auto x:v) {} | 遍历容器简化 | 对容器修改需用引用 auto& x |
| constexpr | 编译期常量 | constexpr int sq(int x){return x*x;} | 常量表达式在编译期求值 | 函数体必须只有返回表达式,不允许复杂语句 |
| 模板改进 | 别名模板 | template<typename T> using Vec=std::vector<T>; | 模板类型重命名 | 可提高代码可读性 |
| 模板改进 | 可变参数模板 | template<typename... Args> void f(Args... args){} | 支持任意数量模板参数 | 递归展开或折叠表达式实现操作 |
| 用户字面量 | 自定义单位 | long double operator"" _km(long double x){return x*1000;} | 支持语义化常量 | 后缀字母需 _ 开头 |
| 正则表达式 | std::regex | std::regex r("\\d+"); std::regex_match("123", m, r); | 支持字符串模式匹配 | 注意性能问题 |
| 数组容器 | std::array/unordered_map/set | std::array<int,3> a = {1,2,3}; std::unordered_map<int,int> m; | 提供固定长度数组和哈希容器 | std::array 容量固定,unordered 容器无序 |
| 原子操作 | std::atomic | std::atomic<int> a(0); a++; | 线程安全的基本类型操作 | 对复杂对象需保证原子性或加锁 |
| 字符串字面量 | UTF-8/16/32 | u8"utf8", u"utf16", U"utf32" | 支持多字节字符集 | 注意编码转换 |
| 右值引用辅助 | std::move/std::forward | std::move(obj), std::forward<T>(x) | 支持完美转发和移动语义 | 误用可能破坏对象状态 |
核心特点总结
语法简化:
auto、范围 for、统一初始化、尾返回类型类型安全:
nullptr、强类型枚举、静态断言性能优化:右值引用、移动语义、智能指针
模板增强:可变参数模板、别名模板
多线程支持:
std::thread、std::mutex、std::atomic现代库支持:
std::regex、std::array、unordered_map/set编译期求值:
constexpr、静态断言

