6月1日 09:46

C++11 到 C++20 新特性有哪些?面试高频考点速览

C++ 每个版本都有高频考点。C++11 最重要:auto 类型推导、range-for 循环、lambda 表达式(捕获列表是重点)、智能指针三件套(unique_ptr 独占、shared_ptr 共享引用计数、weak_ptr 打破循环)、右值引用与移动语义(避免深拷贝)、nullptr 替代 NULL、constexpr 编译期计算。C++14 补充了泛型 lambda(参数用 auto)和 make_unique。C++17 重点:结构化绑定、if constexpr 编译期分支、optional/variant/any 三种可选类型、string_view 避免字符串拷贝。C++20 大更新:concepts 约束模板参数、ranges 组合式数据处理、协程(co_yield/co_await)、modules 替代头文件、三路比较运算符 <=>。

追问

unique_ptr 和 shared_ptr 的主要区别是什么?

unique_ptr 独占所有权,不可拷贝只能移动,零开销。shared_ptr 引用计数共享所有权,拷贝时计数加一,有原子操作开销。优先用 unique_ptr,需要共享时才用 shared_ptr,weak_ptr 解决 shared_ptr 循环引用。

移动语义解决了什么问题?

右值引用(T&&)绑定到临时对象,移动构造/赋值直接"窃取"资源指针而非深拷贝。典型场景:函数返回大对象、vector 扩容时移动而非拷贝元素。std::move 本身不移动,只是把左值转成右值引用。

lambda 捕获列表 [=] 和 [&] 有什么坑?

[=] 按值捕获,若捕获 this 指针,实际捕获的是指针而非对象副本,对象析构后 this 悬空。[&] 按引用捕获,引用的局部变量出了作用域就失效。异步回调中用这两种捕获极易出 bug,推荐显式列出要捕获的变量。

C++20 concepts 相比 SFINAE 有什么优势?

concepts 用 requires 子句或 concept 名直接约束模板参数,编译错误信息可读,报错位置准确。SFINAE 用 enable_if,报错信息是一堆模板展开的乱码,调试困难。concepts 还能作为类型标注放在参数位置,代码更清晰。

标签:C++