Skip to content

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.mdlambda、auto 推导
features-cpp11.mdC++11~20 特性清单 + constexpr/default/delete/nullptr
raii.mdRAII:是什么、设计要点、哪些设施体现 RAII、异常安全
ranges.mdC++20 ranges:view 管道、投影、惰性
views-format.mdstring_view/span/format/<=>/module
coroutine:见 concurrency/coroutine.md
模板元编程:见 metaprogramming/
uto.md)lambda、auto 推导
features-cpp11.mdC++11~20 特性清单 + constexpr/default/delete/nullptr
ranges.mdC++20 ranges:view 管道、投影、惰性
views-format.mdstring_view/span/format/<=>/module
coroutine:见 concurrency/coroutine.md
模板元编程:见 metaprogramming/

糌粑的面经笔记 · VitePress 版