12.4 — 对 const 的左值引用
在上一课 () 中,我们讨论了左值引用只能绑定到可修改的左值。这意味着以下代码是非法的:int main() { const int x { 5 }; // x 是不可修改的 (const) 左值 int& ref { x }; // 错误:ref 无法…
在上一课 () 中,我们讨论了左值引用只能绑定到可修改的左值。这意味着以下代码是非法的:int main() { const int x { 5 }; // x 是不可修改的 (const) 左值 int& ref { x }; // 错误:ref 无法…
在一个接受参数的函数中,调用者可能会传入语法有效但语义上无意义的参数。例如,在上一课 () 中,我们展示了以下示例函数:void printDivision(int x, int y) { if (y != 0) std::cout << static_cast<double>(x) / y; …
智能指针类是一个组合类,旨在管理动态分配的内存,并确保当智能指针对象超出作用域时内存被删除。拷贝语义允许我们的类被拷贝。这主要通过拷贝构造函数和拷贝赋值运算符完成…
在上一课中,我们看到了 std::shared_ptr 如何允许我们有多个智能指针共同拥有同一资源。然而,在某些情况下,这可能会出现问题。考虑以下情况:两个不同对象中的共享指针相互指向:#include <iostream> #include <memory> // …
与旨在单独拥有和管理资源的 std::unique_ptr 不同,std::shared_ptr 旨在解决需要多个智能指针共同拥有资源的情况。这意味着多个 std::shared_ptr 指向同一资源是没问题的。在内部,std::shared_ptr 会跟踪有多少个…
在本章开头,我们讨论了在某些情况下使用指针可能导致错误和内存泄漏。例如,当函数提前返回或抛出异常且指针未正确删除时,就可能发生这种情况。#include <iostream> void someFunction() { auto* …
考虑 C++ 中的一个固定整数数组:int array[5]; 如果我们想用值初始化这个数组,我们可以直接通过初始化列表语法来完成:#include <iostream> int main() { int array[] { 5, 4, 3, 2, 1 }; // 初始化列表 for (auto i : …
一旦你开始更频繁地使用移动语义,你就会发现一些情况,你希望调用移动语义,但你必须使用的对象是左值,而不是右值。以下面的 swap 函数为例:#include <iostream> #include <string> template <typename T> void mySwapCopy(T& a, …
在课程中,我们了解了 std::auto_ptr,讨论了对移动语义的需求,并探讨了当为拷贝语义(拷贝构造函数和拷贝赋值运算符)设计的函数被重新定义以实现移动语义时出现的一些缺点。在本课中,我们将…
在第 12 章中,我们介绍了值类别 () 的概念,它是表达式的一个属性,有助于确定表达式是否解析为值、函数或对象。我们还介绍了左值和右值,以便我们可以讨论左值引用。如果你对左值和右值感到模糊,…