条款26明确指出,对万能引用进行重载是一个坏主意,因为它过于“贪婪”,会意外地匹配到许多本意是想调用其他重载函数的调用。本条款则提供了多种替代方案,让我们可以在需要区分处理不同类型的同时,安全地使用万能引用的强大功能。
简单的替代方案
在介绍复杂技术之前,有几种简单的替代方法:
舍弃重载,使用不同函数名:这是最简单的办法。与其重载
logAndAdd(T&&) 和...
这一讲开门见山:
将一个接受万能引用参数的函数或模板与其他函数进行重载,是一个非常危险的设计,因为它几乎总是会导致意想不到的行为和难以理解的编译错误。
核心问题:万能引用的“贪婪”
万能引用(在模板中声明为
T&&)之所以危险,是因为它过于“贪婪”。根据C++的模板类型推导和重载决议规则,万能引用可以为几乎任何类型的实参生成一个精确匹配
(Exact Match) ...
我们在条款23了解了std::move 与 std::forward,
而条款25提供了一个简单、强大且几乎永远正确的指导方针,用于决定何时使用
std::move 以及何时使用 std::forward, 那就是: -
对右值引用,总是使用 std::move
来进行转发。 - 对万能引用,总是使用
std::forward 来进行转发。
std::move 用于右值引用
右...
“完美转发”是 C++11
中一个极其强大的特性,但它并非在所有情况下都“完美”。该条款的核心是揭示几种完美转发会失败或产生非预期行为的边界情况,并提供相应的解决方案。
什么是完美转发失败
完美转发的理想目标是:一个转发函数 fwd 在接收某个表达式 expr
时,其行为应与将 expr 直接传递给目标函数 f 的行为完全相同。
12f(expression); // 直...
不同于std::unique_ptr,std::shared_ptr
是一种用于管理共享所有权资源的智能指针。当多个代码块需要共同拥有和管理同一个对象的生命周期,并且希望在该对象的最后一个使用者结束使用时自动销毁它,std::shared_ptr
就是理想的选择。它实现了类似垃圾回收的自动内存管理,但其析构是确定性的。
工作原理:引用计数
std::shared_ptr 的核心机制是...
捕获过滤器
“捕获过滤器”是在你开始捕获之前设置的一个规则。它的作用是告诉
Wireshark:“请你只记录符合这个规则的数据包,其他所有的包都直接丢弃,不要保存。”
捕获过滤器 (Capture
Filter):捕获前设置,只保存匹配的包(数据量小)。
显示过滤器 (Display
Filter):捕获后设置,捕获所有包,但根据选择只显示匹配的包(数据量大,但分析灵活)。
...
数据链路层的主要功能是让帧在物理介质上可靠地传输。它位于物理层之上,网络层之下,负责将网络层传下来的数据包封装成帧,并处理帧的传输、差错检测和流量控制等问题。
它使用的通信信道主要有两种:
点对点信道 (Point-to-Point
Channel):通信双方通过专用的物理链路直接连接,数据在两点之间一对一传输。例如,串行通信、PPP协议等。
广播信道 (Broadcast
C...
电路交换, 报文交换和分组交换
在计算机网络中,数据交换技术是指在网络节点之间传输数据时所采用的方式。根据数据传输的组织形式,主要分为三种基本类型:电路交换
(Circuit Switching)、报文交换 (Message Switching) 和 分组交换 (Packet
Switching), 三种方式的比较如上图
电路交换
电路交换
是一种在通信双方之间建立一条专用物...