22.5 — std::unique_ptr

在本章开头,我们讨论了在某些情况下使用指针可能导致错误和内存泄漏。例如,当函数提前返回或抛出异常时,如果指针没有被正确删除,就可能发生这种情况。#include <iostream> void someFunction() { auto* …

23.7 — std::initializer_list

考虑C++中的一个固定大小的整数数组:int array[5]; 如果我们想用值初始化这个数组,我们可以直接通过初始化列表语法来完成:#include <iostream> int main() { int array[] { 5, 4, 3, 2, 1 }; // 初始化列表 for (auto i : …

22.4 — std::move

一旦你开始更频繁地使用移动语义,你就会发现有些情况下你想调用移动语义,但你必须使用的对象是左值,而不是右值。考虑以下交换函数作为示例:#include <iostream> #include <string> template <typename T> void mySwapCopy(T& a, …

22.2 — 右值引用

在第12章中,我们介绍了值类别的概念(),它是表达式的一个属性,有助于确定表达式是解析为值、函数还是对象。我们还介绍了左值和右值,以便我们可以讨论左值引用。如果你对左值和右值感到模糊,…

27.7 — 函数 try 块

Try 和 catch 块在大多数情况下工作良好,但在一种特殊情况下它们不够用。考虑以下示例:#include <iostream> class A { private: int m_x; public: A(int x) : m_x{x} { if (x <= 0) throw 1; // 异常在此处抛出…