C++ 函数对象、回调与单一定义规则详解
1. 函数对象与回调
C++ 标准库的 STL 部分运用了函数对象(functors)的概念。所有算法都借助函数对象来定制其确切行为,其中许多函数对象被称作谓词(predicates)。谓词是返回布尔值(可转换为 bool 的值)的函数或函数对象。一般而言,谓词应当是纯函数对象,否则可能会产生意外结果。
C++ 标准库还提供了一些标准函数对象和用于组合的适配器。实际上,对于每个常见的一元和二元运算符,都有对应的函数对象。不过,标准库并未提供足够的适配器来支持将所有函数行为组合成函数对象。例如,无法将两个一元运算的结果组合成诸如 “this and that” 这样的准则。而 Boost C++ 库则提供了补充适配器,填补了这一空白。
2. 单一定义规则(One-Definition Rule,ODR)
单一定义规则是构建结构良好的 C++ 程序的基石。其最常见的结果易于记忆和应用:在所有文件中,非内联函数只能定义一次;在每个翻译单元中,类和内联函数最多定义一次,并且要确保同一实体的所有定义都相同。
2.1 翻译单元
在实际编写 C++ 程序时,我们会在文件中填充 “代码”。但在 ODR 的语境下,文件的边界并非至关重要,真正重要的是所谓的翻译单元。本质上,翻译单元是将文件输入编译器前,经过预处理器处理后的结果。预处理器会删除未被条件编译指令(如 #if 、 #ifdef 等)选中的代码段,删除注释,递归插入 #included 文件,并展开宏。
例如,以下两个文件
超级会员免费看
订阅专栏 解锁全文
1251

被折叠的 条评论
为什么被折叠?



