Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
CAN CSA ISO/IEC TR 19768-08 (2018) 是加拿大标准委员会(SCC)采纳的等同版本,对应国际标准 ISO/IEC TR 19768:2007(及其后的确认)。该技术报告通常被称为 C++ Technical Report 1 (TR1),它是对当时 C++ 标准库(ISO/IEC 14882:2003)的第一套官方扩展提案。TR1 的核心理念是“不改变语言核心,仅扩展标准库”,因此它完全基于 C++03 的语法与语义。
该标准的适用范围包括:
– 向 C++ 标准库添加 14 个新的库组件,涵盖泛型编程、功能性、文本处理、数值计算等领域;
– 为编译器与标准库实现者提供规范性建议,确保不同实现间的一致性;
– 为 C++ 开发者提供一组经过同行评审、可移植的库功能,减少对平台特定或第三方库(如 Boost)的依赖。
尽管 TR1 中的大部分功能最终被 C++11(ISO/IEC 14882:2011)吸收并进入 std 命名空间,但 CAN CSA ISO/IEC TR 19768-08 (2018) 仍在诸多遗留系统、嵌入式平台或需要严格遵循早期标准的项目中扮演重要角色。
TR1 定义了 14 个独立但相互关联的库模块。下表列出了核心组件及其功能描述:
| 组件名称 | 头文件(示例如 <tr1/…>) | 功能简述 |
|---|---|---|
| 智能指针 (Smart Pointers) | memory | 提供 shared_ptr, weak_ptr, scoped_ptr,支持引用计数的所有权管理 |
| 正则表达式 (Regular Expressions) | regex | 支持 ECMAScript 语法,提供 regex_match, regex_search, regex_replace 等算法 |
| 随机数生成 (Random Number Generation) | random | 引擎(如 mt19937)与分布器(均匀、正态、离散等)分离的设计 |
| 元组 (Tuples) | tuple | 固定大小的异构元素集合,支持 get, make_tuple, tie |
| 类型特征 (Type Traits) | type_traits | 编译期判断类型属性(is_integral, is_class, remove_const 等) |
| 函数对象与绑定 (Function Objects & Bind) | functional | 提供 function 多态包装器、bind 占位符绑定机制 |
| 数组 (Array) | array | 固定容量的容器,行为类似内置数组但提供 STL 接口与越界检查 |
| 引用包装 (Reference Wrapper) | functional | reference_wrapper 将引用转换为可拷贝对象,用于容器或算法 |
| 增强的成员指针适配器 | functional | mem_fn 便捷生成成员函数/成员对象适配器 |
| 数学特殊函数 (Mathematical Special Functions) | cmath(扩展) | 如椭圆积分、贝塞尔函数、勒让德多项式等(可选实现) |
| 外推或“特性”类(optional) | — | 某些实现额外提供了 optional, any 等,但 TR1 正文未强制 |
std::tr1 命名空间下,例如 std::tr1::shared_ptr。这避免了与 C++ 标准库现有名称或未来增强的冲突。实现在引入 C++11 后常提供 using namespace std::tr1 兼容性选项。 TR1 的每项扩展均遵循以下要求:
1) 头文件独立:每个组件对应一个独立头文件(如 <tr1/type_traits>),便于逐步采用。
2) 迭代器与算法兼容:所有容器(如 array)提供标准 STL 迭代器接口,可直接用于 <algorithm> 中的泛型算法。
3) 异常安全保证:智能指针与容器需提供至少基本或强异常安全保证,具体要求在标准中详细规定。
4) 实现可选择性:除核心组件(如智能指针、tuple、type_traits)外,“数学特殊函数”等复杂度高或平台相关的组件被标记为“可选”,实现可以合法地不提供。
尽管 TR1 编写时假设实现遵循 C++03,但在 2026 年,主流 C++ 编译器(如 GCC、Clang、MSVC)都已在 std::tr1 命名空间(或直接 std 中)提供支持。实施时需注意:
– 旧版编译器可能需要专用头文件(如 <tr1/memory>),而现代编译器可能将 TR1 视为与 C++11 兼容的遗留路径。
– 可移植性:推荐使用 #ifdef _HAS_TR1 或 __cpp_lib_tr1 等宏检测可用性,并在代码中提供回退。
shared_ptr、regex)在 C++11 中已被升级且放入 std 命名空间。如果目标环境完全支持 C++11,不建议继续使用 std::tr1 版本,因为前者提供了移动语义、constexpr 优化和更好的性能。除非项目约束要求严格遵守 TR1 规范或维护遗留代码,否则应迁移至 std。 <tr1/array>:相比内置数组,std::tr1::array 提供 size()、迭代器、at() 越界检查等现代接口,且不引入动态分配开销。shared_ptr 适用于共享所有权;weak_ptr 用于打破循环引用;scoped_ptr(非标准 TR1 但常随同实现)等同于 unique_ptr 的前身。std::tr1::regex 的实现效率因迭代而异,建议在性能敏感代码中预编译正则对象(regex 构造时不指定优化标志可能导致较慢匹配)。is_integral、is_floating_point 等实现 SFINAE 重载,提升元编程代码的效率与清晰度。由于 TR1 是技术报告(Type 3),并非具有强制性的国际标准,但“CAN CSA”标识意味着加拿大已将其采纳为国家标准。建议在要求严格合规的项目中:
– 验证编译器实现是否通过了 TR1 配套测试套件(如 Dinkumware 的 TR1 测试或 Boost TR1 实现)。
– 明确记录所依赖的 TR1 版本与命名空间,避免因 C++11 迁移导致的命名冲突。
CAN CSA ISO/IEC TR 19768-08 (2018) 与以下标准密切相关:
• ISO/IEC 14882 (C++ 标准):TR1 是 C++ 标准的扩展,最初设计为在 C++03 基础上新增库,但未修改核心语言。随后 C++11 将 TR1 大部分内容标准化,并移入 std 命名空间,同时进行了细微语义调整(例如 auto_ptr 被 unique_ptr 替换,bind 支持右值引用等)。
• ISO/IEC TR 19769 (C 的扩展):另一份技术报告,专注于 C 语言库扩展,如类型泛型数学函数,与 TR1 无直接关联但同属编程语言扩展系列。
• Boost 库:TR1 的多数提案源自 Boost 社区(如 Boost.SmartPtr、Boost.Regex、Boost.Bind、Boost.Random)。实际上,TR1 是 C++ 标准化历史上首次正式从 Boost 吸收技术。
• CA/CGSB 或 CAN/CSA 系列:作为加拿大采纳的国际标准,它常被纳入政府与工业采购要求,与 CAN/CSA-ISO/IEC 14882 (C++ 标准) 配套使用。
shared_ptr 的引用计数非原子或原子实现会直接影响内存安全;TR1 允许实现选择,但安全关键代码应显式要求(如使用 Boost 的 shared_ptr 时检测宏 BOOST_SP_USE_QUICK_ALLOCATOR)。标准本身的非强制性意味着实现质量参差,必须独立评估。 std::tr1::shared_ptr 还是将代码升级到 C++11 的 std::shared_ptr?std::shared_ptr 在类型安全(完美转发删除器)、移动语义(减少原子操作)和 make_shared 方面有显著改进。若必须使用 TR1,请确保实现支持 weak_ptr 循环检测且测试充分。 regex 性能如何?是否支持 Unicode?std::regex 实现更成熟)。