Appearance
C++ 现代特性(C++11/14/17/20)专题
一句话总览
C++ 面试的「新特性部分」≈ auto、右值引用 + 移动语义 + 完美转发、lambda、智能指针、constexpr、delete/default、range-for、结构化绑定、std::optional/variant/any。底层推导与原理是追问重点。
问题清单(含答案)
1. 说一下了解哪些 C++11 新特性?
答案
auto/decltype、右值引用 + 移动语义 + 完美转发、lambda、智能指针、constexpr、nullptr、default/delete、range-for、可变参数模板、std::thread、unordered_*、enum class 等(能列 8~10 个即过关)。
2. 左值 vs 右值?左值引用 vs 右值引用?
答案
左值有名字、可持久、可取址;右值是临时/将亡值。T& 绑左值,T&& 绑右值(是移动语义的载体)。
3. 什么是移动语义?为什么要 move?与拷贝的区别?
答案
把资源所有权从右值"偷"过来(转移内部指针、把源置空),避免深拷贝。对昂贵对象(大容器/独占资源)性能提升巨大;拷贝是复制一份,源不变。
4. std::move 做了什么事?它是真的「搬」吗?
答案
只做 static_cast<T&&>,把左值转成右值引用,本身不搬任何东西;真正的搬发生在移动构造/移动赋值。所以 move 后源对象处于"有效但未指定"状态。
5. 完美转发 与 引用折叠规则?
答案
万能引用 T&& 配合 std::forward<T> 保持参数的值类别和 const 不变(右值仍是右值)。引用折叠:&&+&→&、&&+&&→&&(& 与任何结合都折叠成 &)。
6. auto 推导规则?
答案
auto 推导 = 模板实参推导:剥引用、剥顶层 const、数组/函数退化成指针(auto x = a 相当于 T x)。decltype(expr) 保留引用和顶层 const(看表达式本身)。
7. lambda 本质是什么?捕获方式的差异?
答案
lambda 是编译器生成的匿名函数对象(operator() 默认 const)。捕获:[] 不捕获、[=] 按值、[&] 按引用、mutable 允许修改按值捕获的副本、捕获 this 可访问成员。
8. constexpr vs const vs 普通函数?
答案
constexpr 函数在参数/结果都是常量时编译期可求值,也能运行期调用;const 只表示只读、不保证编译期;普通函数无编译期要求。
9. default/delete 的作用?
答案
=default 显式要求编译器生成默认实现;=delete 显式禁止(如禁拷贝构造/赋值,unique_ptr 即如此)。
10. nullptr 相比 NULL 优势?
答案
nullptr 有独立类型 nullptr_t、可转任意指针类型;NULL 是 0,调用重载 f(int)/f(int*) 时会有二义性/选错。
11. range-for / 结构化绑定 / if-init / using 别名 / enum class?
答案
range-for 基于 begin/end 遍历;结构化绑定 auto [a,b] 解包 pair/tuple/聚合体;if-init 在 if/switch 里加初始化语句;using 别名替代 typedef;enum class 强类型、有作用域、不可隐式转 int。
12. C++17/20 新增了解哪些?
答案
C++17:结构化绑定、if constexpr、inline 变量、fold 表达式、optional/variant/any、filesystem、CTAD。C++20:concepts/requires、ranges、std::format、三向比较 <=>、coroutine、module。
子文档
| 文件 | 内容 |
|---|---|
index.md | 本总览 |
move-semantics.md | 左右值、移动语义、完美转发、引用折叠 |
lambda-auto.md | lambda、auto 推导 |
features-cpp11.md | C++11~20 特性清单 + constexpr/default/delete/nullptr |
raii.md | RAII:是什么、设计要点、哪些设施体现 RAII、异常安全 |
ranges.md | C++20 ranges:view 管道、投影、惰性 |
views-format.md | string_view/span/format/<=>/module |
coroutine:见 concurrency/coroutine.md | |
模板元编程:见 metaprogramming/ | |
| uto.md) | lambda、auto 推导 |
features-cpp11.md | C++11~20 特性清单 + constexpr/default/delete/nullptr |
ranges.md | C++20 ranges:view 管道、投影、惰性 |
views-format.md | string_view/span/format/<=>/module |
coroutine:见 concurrency/coroutine.md | |
模板元编程:见 metaprogramming/ |