C++ 学习阶段的三个参考文档
查看库文件(非官方文档): Cplusplus.com
该文档在 C++98、C++11 时期尚可,之后版本更新滞后。
准官方文档(同步更新): cppreference
推荐作为主要查阅资源,涵盖至 C++26 标准,语法查询准确。
官方文档(类似论坛): Standard C++
社区讨论活跃,适合深入探讨标准细节。
4. 可变参数模版
4.1 emplace 系列接口
4.1.1 不同容器 emplace 系列接口展示
STL 容器普遍支持 emplace_back 和 emplace 接口,用于原地构造元素。
4.1.2 emplace 系列接口概念
template<class... Args>
void emplace_back(Args&&... args);
template<class... Args>
iterator emplace(const_iterator position, Args&&... args);
C++11 引入的 emplace 系列接口基于模板可变参数,功能兼容 push 和 insert,但支持直接传递构造参数。相比 push_back 或 insert,emplace 能在容器内部空间直接构造对象,避免临时对象的拷贝或移动开销。
总体而言,emplace_back 效率更高,建议优先使用。当传入右值时,emplace_back 与 push_back 效率相近;但在处理 string 等复杂类型时,emplace_back 能一步到位直接构造,而 push_back 可能涉及额外的移动构造步骤。
模拟实现中,通过完美转发将参数包传递给节点构造函数,确保在容器存储位置直接完成 T 对象的构建。
4.1.3 万能引用
在参数包传递过程中,若使用 Args&&... args,需配合 std::forward<Args>(args) 进行完美转发,防止右值引用变量在展开后变为左值。
5. 新的类功能
5.1 默认成员函数:移动构造和移动赋值
C++ 类原本包含 6 个默认成员函数,C++11 新增了两个:移动构造函数和移动赋值运算符重载。
生成条件较为苛刻:若未自定义移动构造函数,且未定义析构函数、拷贝构造函数、拷贝赋值运算符中的任意一个,编译器会自动生成默认移动构造。对于内置类型执行逐字节拷贝,自定义类型则调用其移动构造(若存在),否则回退到拷贝构造。
注意:若提供了移动构造或移动赋值,编译器将不再自动生成拷贝构造和拷贝赋值。
5.2 成员函数声明时的缺省值
成员变量声明时的缺省值会在构造函数初始化阶段生效。若初始化列表中未显式指定,则使用声明时的缺省值;若显式指定,则以初始化列表为准。


