﻿/*
	© 2012-2016 FrankHB.

	This file is part of the YSLib project, and may only be used,
	modified, and distributed under the terms of the YSLib project
	license, LICENSE.TXT.  By continuing to use, modify, or distribute
	this file you indicate that you have read the license and
	understand and accept it fully.
*/

/*!	\file YBase.txt
\ingroup Documentation
\brief YBase 说明。
\version r937
\author FrankHB <frankhb1989@gmail.com>
\since build 305
\par 创建时间:
	2012-04-29 17:11:42 +0800
\par 修改时间:
	2016-04-10 14:40 +0800
\par 文本编码:
	UTF-8
\par 模块名称:
	Documentation::YBase
*/


/*

@0 体例和适用范围：
引用标记参见 [Documentation::CommonRules @@0.1] 。
项目范围参见 [Documentation::ProjectRules @@1] 。
本文档适用于 YBase 。
部分编码细节和其它规范和 YFramework 共享，参见 [Documentation::Designation] 。

@1 整体设计：
YBase 是 YSLib(the YSLib project) 的顶级子项目([ProjectRules @@1.3]) ，且不被其它顶级子项目依赖。

@1.1 设计的基本原理和表达形式：
以扩展标准库为基础构建 YSLib 项目的基础实现。

@1.2 理论背景、工具和依据：
基本内容参见 [Documentation::CommonRules @@2.1] 。
标准库扩展部分和 Boost 接口兼容，参见 http://www.boost.org/ 。

@1.3 构建原则：
基本内容参见 [Documentation::CommonRules @@2.2] 。
其它见 [Documentation::Designation @@2.3] 。

@1.3.1 目标代码兼容性：
基本内容参见 [Documentation::Designation @@2.3.6] 。
现阶段 YBase 提供以下二进制兼容性保证：
除非在变更日志中使用 $src 标识([Documentation::ProjectRules @@2.2.7.1]) ，满足二进制库向后兼容保证([Documentation::CommonRules @@2.2.4.2]) 。

@2 约束、组成和架构：
YBase 包括 YDefinition(@2.4) 、YStandardEx(@2.5) 、LibDefect(@2.6) 和 Test(@2.7) 模块。

@2.1 LibDefect 以外的设计和实现原则：

@2.1.1 调用安全性：
基本内容参见 [Documentation::CommonRules @@3.11] 。
除非另行约定， YBase 中 LibDefect 以外的接口仅保证非成员或静态成员函数的可重入性和线程安全性。
除非有显著性能问题，否则非成员或静态成员接口应保证线程安全性。
不依赖异步安全性，不在任何实现中直接调用终止程序或对应注册回调的函数([Documenation::LanguageConvention @@5.15.3.4]) 。
不降低性能时尽量保证可重入性。

@2.1.2 语言规范：
遵守的具体标准规范及替代和扩展接口约定参见 https://bitbucket.org/FrankHB/yslib/wiki/StandardUsing.en-US.md 。
尽量严格遵守 ISO C++ ，涉及未指定行为和实现定义的行为时应由文档说明。
默认使用 ISO C++11 的一个严格子集，基本内容参见 [Documentation::ProjectRules @@1.2.1] ，不符合此规则的例外由本节指定或文档另行约定。
允许在预处理指令中使用特定实现的宏检查支持的特性，作为进行非正式的变通。
允许使用去除后不影响语义正确性和可观察行为的扩展。
除以上或另行约定（参见 @2.4 、 @2.5 和 @2.6），不使用不向后兼容 ISO C++11 或更新版本的语言特性，或依赖特定平台实现的接口。

@2.2 文件依赖性：
以下为基本代码依赖性规则按（以优先级顺序排列，即后者不满足前者的部分以前者为准）：
子项目满足线性顺序依赖([Documentation::ProjectRules @@1.1.1]) ：依次为 ydef.h(@2.4) 、 LibDefect 、 YStandardEx 和 YTest 。
ydef.h 仅依赖标准库头。
LibDefect 不包含头文件或仅包含标准库头。
YBase 依赖且仅依赖 YBase 文件和标准库头。
YStandardEx 相关的头文件依赖性参见 @2.5.1 。

@2.2.1 实现修正：
YBase 中 YDefinition(@2.4) 和 LibDefect(@2.6) 以外的部分可能包含 LibDefect 的头文件提供修正定义。
YBase 内使用这些宏时不依赖外部头文件的包含顺序，即在需要使用时，保证可用的宏和实体已被引入。
用户程序若使用定义了这些宏的 YBase 头文件且在某个翻译单元中存在明确依赖 LibDefect 头文件提供的内容时，则应保证在这个翻译单元内使用这些内容前包含 LibDefect 对应头文件而不仅是约定的标准库头，以避免违反 ODR([Documentation::YBase @@5.1.8]) 造成未定义行为。

@2.2.2 宏依赖：
YBase 可能扩展 __cpp 为前缀的特性检测宏（如 WG21 P0096R1 ），仅当特定实现包含指定头（若需要）后仍没有定义该宏但实际特性可用时。
其中表示库特性的 __cpp 为前缀的可能在 YDefinition 或 YStandardEx(@2.5) 中提供，而其它（核心特性） __cpp 前缀的宏仅在 YDefinition 中提供。
YBase 内使用这些宏时不依赖外部头文件的包含顺序，即在需要使用时，保证可用的宏已被定义；即应保证对应的标准库头被包含一次，包含后立刻检查是否已经定义；若没有定义，可补充定义。
关于 YBase 检查定义并提供的宏列表参见 [Documentation::Definitions] 。
若其它文件需要使用经过这些宏，需注意包含 YBase 头文件的顺序。
用户程序若使用定义了这些宏的 YBase 头文件且在某个翻译单元中存在明确依赖这些宏是否被定义或替换的值的实体声明，则应保证在这个翻译单元内使用这些内容前包含 YBase 对应头文件而不仅是约定的标准库头，以避免违反 ODR 造成未定义行为。

@2.3 名称：
对模块，基本使用参见 [Documentation::ProjectRules @@3.2] 。
对语言支持的命名空间，基本使用参见 [Documentation::ProjectRules @@3.5] 、 [Documentation::LanguageConvention @@5.15.1.1] 。
代码中限定名称的语用参见 [Documentation::Designation @@6.2.3] 。

@2.3.1 标识符限制：
公开头文件不使用保留标识符([Documentation::LanguageConvention @@5.15.1]) ，包括使用实现扩展提供的宏。使用 YDefinition([Documentation::YBase @@2.4]) 包装的宏代替。

@2.3.2 YBase 引入的命名空间：
YBase 引入的主要命名空间唯一且和次级子项目的模块名称一致（但 YDefinition(@2.4) 此处同 YStandardEx(@2.5) ）。
ystdex ：从 std 扩充的平台无关的实用程序 YStandardEx 。 YSLib 本体直接依赖此命名空间。
ytest ：测试框架设施 YTest 。

@2.4 YDefinition ：
模块 YBase::YDefinition ，文件名 ydef.h ，是其它 YBase 头文件的公共依赖项。
若其它文件不依赖此文件，则也不依赖其它 YBase 文件。
YDefinition 实现及判断语言特性的接口可能依赖具体语言实现的特性限制，允许在预处理指令中使用特定实现的宏检查支持的特性。
YDefinition 在 @2.1.2 的基础上支持更多实现，且提供特定 ISO C++11 关键字的替代。
YDefinition 中的特性应保证在被替代的关键字不被支持时仍可以被实现接受。
文件內容为系统环境和公用类型和宏的基础定义，包括对实现环境的检测、实现特性的封装、部分未被实现关键字替代以及一些语言层次上的公共基础设施。
以下名称以 y 起始的宏是表达式宏([Documentation::CommonRules @@5.10]) 或替代关键字(@2.4.7) 。

@2.4.1 实现标记宏：
YB_IMPL_CPP 指示支持的 ISO C++ 版本。
其它 YB_IMPL_* 宏指示实现的版本。

@2.4.2 预处理器通用助手宏 ：
用于预处理记号处理。

@2.4.3 宏 yimpl ：
接口代码中标注不作为公开接口实现而不应被用户依赖具体内容的部分的宏。
保证记号被原样替换。

@2.4.4 语言实现特性宏：
指示受到支持的若干 C++ 语言和方言特性。
宏名仅使用大写字母和下划线。

@2.4.5 库选项宏：
辅助静态库和动态库编译。
宏名仅使用大写字母和下划线。
公开 API 以宏 YB_API 标识。
在 Win32 平台上支持动态库。构建动态库时需定义 YB_BUILD_DLL ；此外，使用动态库时需定义 YB_DLL 。

@2.4.6 特性选项宏：
指示是否启用若干特性。

@2.4.7 替代关键字：
模拟语言实现的关键字。
宏名仅使用小写字母。

@2.4.7.1 宏 yunused ：
用于标记未使用的表达式。
显式转换为 void 类型以标记表达式未被作为子表达式使用，可避免某些实现的警告。

@2.4.7.2 宏 yoffsetof ：
同标准库宏 offsetof ，但额外提供了对可能引起未定义行为的检查。
某些实现（如 GNU C++ ）可能已经自行提供了内建检查，所以此宏并非必要。但为了一致性在库的代码使用此宏。

@2.4.7.3 宏 yunseq ：
用于标记无序列依赖表达式组，以支持非序列优化。
参见 [Documentation::CommonRules @@5.4.3.3] 。
调用宏 yunseq 对代码格式化目的视为特别约定([Documentation::CommonRules @@5.4.3.3]) ，按以下规则处理：
参数不包含块结构（如 lambda 表达式）且不超过 3 行时，视为函数调用格式化，或表示此处代码未完成（需要继续扩展）时使用以下规则；
其它情况下宏名、每个参数和调用的 ) 单独占据独立的行，每个参数视为语句，但不需要添加额外的 { 和 } 组成块的边界。

@2.5 YStandardEx ：
YStandardEx 直接扩充标准库，包含仅依赖标准库而非标准库实现的接口。
实现的内容限制为以下两个部分：
适用范围最广的基础设施（比标准库更严格），如序列/非序列调用、通用类型转换、元类型、函数对象、迭代器；
直接基于标准库接口的抽象和封装，如输入/输出抽象。
所有更具体应用问题领域相关的或特定于运行时表达形式相关的操作，如形式语言处理等，都不由 YStandardEx 直接提供接口。
YStandardEx 及其实现保持兼容 ISO C++11 。

@2.5.1 文件依赖性：
非头文件依赖对应的头文件。

@2.5.1.1 标准库扩展：
部分头文件以一对一或多对一的形式在相似接口意义上扩展（或替代） ISO C++ 标准库，参见 @2.5.6 和 @2.5.7 。
其中扩展 ISO C 标准库接口的部分不依赖扩展其它接口的头文件。
扩展的标准库头（及 LibDefect(@2.6) 对应的头文件）被直接或间接地包含。

@2.5.1.2 头文件直接依赖性：
基本头文件扩展(@2.5.5) 的头文件依赖 "type_traits.hpp" ；
"integer_sequence.hpp" 依赖 "variadic.hpp" ；
"tuple.hpp" 依赖 "integer_sequence.hpp" ；
"type_op.hpp" 依赖 "tuple.hpp" ；
"ref.hpp" 和 "memory.hpp" 依赖 "addressof.hpp" ；
"utility.hpp" 依赖 "type_pun.hpp" ；
"iterator_op.hpp" 依赖 "range.hpp" 和 "deref_op.hpp" ；
"iterator.hpp" 依赖 "iterator_op.hpp" ；
"functional.hpp" 、 "hash.hpp" 和 "mixin.hpp" 依赖 "tuple.hpp" ；
"functional.hpp" 依赖 "ref.hpp" ；
"any.h" 依赖 "typeinfo.h" 和 "utility.hpp" ；
"any_iterator.hpp" 依赖 "any.h" ；
"string.hpp" 依赖 "container.hpp" 。
另见 @2.5.4 、 @2.5.5 、 @2.5.6 和 @2.5.7 。

@2.5.2 命名空间和模板特化：
除在块作用域、非公开的实现命名空间和此处列明的例外，禁止其它的别名声明引入 std 成员命名空间：
ystdex 中对标准库的元编程和类型特征名称使用别名声明；
文档指定的以实现为 ADL([Documentation::LanguageConvention @@5.3.3.1]) 提供并行重载为目的的别名声明。
ystdex 的类型在声明所在的同一头文件中，可能存在 std 命名空间中的类模板的对应特化。

@2.5.2.1 非公开实现命名空间：
命名空间 ystdex 内 details 命名空间和声明以宏 yimpl(@2.4.3) 修饰的命名空间保留为非公开实现。
非头文件的非公开实现命名空间中，在未命名命名空间内使用库保留标识符([Documentation::CommonRules @@4.1.6]) 命名具有内部链接([Documentation::LanguageConvention @@5.5.8.1]) 的非公开命名空间，以避免任意公开命名空间的改动造成污染。
另见 [Documentation::ProjectRules @@2.2.4.2] 。

@2.5.2.2 公开命名空间：
ystdex ： YStandardEx 使用的默认命名空间。
ystdex::any_ops ： ystdex::any 相关的底层操作接口。
inline ystdex::cpp2011 包含 ISO C++ 2011 引入的名称的命名空间。
inline ystdex::cpp2014 包含 ISO C++ 2014 引入的名称的命名空间。
ystdex::dep_ops ： YBase::YStandardEx::Operators 使用的隔离 ADL 的命名空间。
ystdex::dep_swap ： 引入 std::swap 实现为 ADL 提供重载的命名空间。
ystdex::threading ：线程相关操作。
ystdex::vseq ：变长序列操作。

@2.5.2.3 标准库命名空间：
std 的成员对 ystdex 命名空间中的类模板可能存在对应特化。注意完整包含所需的头文件，而不仅是 std 成员声明的标准库头。当前包括以下类型：
std::tuple （使用 "tuple.hpp" 代替 <tuple> ）。

@2.5.3 标准库兼容接口：
YStandard 的一些公开接口实体和标准库命名空间 std 或 TS （技术规范）命名空间中 std::expermental 的实体声明基本一致，以提供代码迁移的便利。
注意这些接口不保证和标准库扩展的头文件(@2.5.1.1) 对应。
这类接口根据声明的实体和标准库提供的一致性分为两类：
可能直接使用命名空间别名或别名声明，此时实体一致；
不以别名声明时，为不同实体，同时使用（如作为重载函数的参数）时需要分别处理，避免违反 ODR([Documentation::LanguageConvention @@5.1.8]) ；
不保证变更接口时会不在上述类别之间迁移。
除非文档另行约定，保证使用 YStandard 接口可替换标准库接口或 TS 接口，但不保证逆向替换可行（ YStandardEx 可扩展标准库中不具备的特性）。
以下文档概要仅包括头文件没有详细明确的部分。

@2.5.4 不依赖其它 YStandardEx 文件的基本头文件：
这些头文件只直接依赖 YDefinition ，不依赖其它 YStandardEx 文件，且尽可能少地直接依赖标准库头。

@2.5.4.1 ISO C++ 类型特征扩展 TypeTraits ：
扩展了标准库头 <type_traits> ，包括元编程设施等。

@2.5.4.2 范围操作 Range ：
扩展标准库头 <iterator> ，提供兼容 ISO C++14 的范围操作等扩展。

@2.5.4.3 解引用操作 DereferenceOperation ：
提供解引用操作检查的模板，作为迭代器操作的基础。

@2.5.4.4 基类实用设施 Base ：
提供适合被作为基类的通用接口。

@2.5.5 基本头文件扩展：
用于构建其它库但不提供标准接口的替代或扩展，只直接依赖上述 YDefinition 的头文件或本节内前述的头文件，可被以下其它 YStandardEx 头文件依赖。

@2.5.5.1 C++ 变长参数相关操作 Variadic ：
使用 ISO C++11 起提供的变长参数包(pack) 的特性提供序列等基本接口的模板库。

@2.5.5.2 共享存储和直接转换 TypePun ：
提供的基于存储布局的存储转换设施，作为实现类型擦除等的基础。

@2.5.5.3 一元操作符 & 和取指针的相关接口 AddressOf

@2.5.5.4 整数序列元编程接口 IntegerSequence ：
扩展了 ISO C++14 标准库头 <utility> 的 std::integer_sequence 等的元编程相关接口，并在 ISO C++14 前提供这些接口和实现。

@2.5.5.5 重载操作符 Operators

@2.5.6 ISO C++ 语言支持库扩展：
以下头文件扩展 ISO C++ 标准定义的语言支持库([support.general]) 中的至少一个并可能扩展其它标准库头，提供对应的相似接口，不依赖以上文件外的 YStandardEx 头文件。

@2.5.6.1 ISO C 标准整数类型操作 CStandardInteger ：
头文件间接扩展了标准库头 <cstdint> ，提供一些类型操作和一些整数类型的模板特化以及模算术的基本支持。

@2.5.6.2 标准库异常扩展接口 Exception ：
扩展了标准库头 <exception> 、 <stdexcept> 和 <system_error> ，提供便利接口和若干异常基类。

@2.5.6.3 ISO C++ 类型信息扩展 TypeInfo ：
扩展了标准库头 <typeinfo> ，提供了无 RTTI 开销的静态类型信息类和兼容接口。

@2.5.7 其它 ISO C++ 标准库扩展和替代：
扩展或替代标准库文件，提供和标准库对应的相似接口，除 @2.5.1.2 外，不依赖之前提及以外的 YStandardEx 头文件。
TypeTraits(@2.5.4.1) 和 Range(@2.5.4.2) 同属此类别。

@2.5.7.1 C++ 类型操作 TypeOperation

@2.5.7.2 迭代器操作 IteratorOperation ：
间接扩展了标准库头 <iterator> 。

@2.5.7.3 ISO C 标准信号扩展操作 CSignal ：
头文件扩展了标准库头 <csignal> ，提供一些便利接口。

@2.5.7.4 ISO C 断言/调试跟踪扩展 CAssert ：
头文件扩展了标准库头 <cassert> ，提供若干断言函数。这些函数提供无异常抛出保证的异常规范以便于在隐式指定异常规范的无异常抛出的析构函数([Documentation::LanguageConvention @@5.10.5.5]) 中使用。
在库使用约定([Documentation::CommonRules @@3.13.2]) 和语言使用规约([Documentation::LanguageConvention @@5.15.3.3]) 的基础上使用方式同 <cassert> 和 <assert.h> （允许定义宏控制重复包含的内容）。

@2.5.7.5 存储和智能指针特性 Memory

@2.5.7.6 实用设施 Utilities ：
扩展了标准库头 <utility> ，提供一些常用杂项功能。

@2.5.7.7 ISO C 字符分类操作扩展 CCharacterCtype ：
头文件扩展了标准库头 <cctype> ，提供一些扩展和替代实现。

@2.5.7.8 ISO C 标准字符串扩展 CString

@2.5.7.9 引用包装 Ref

@2.5.7.10 通用仿函数 Functor

@2.5.7.11 元组类型和操作 Tuple ：
扩展了标准库头 <tuple> ，提供类型特征和序列相关的特化操作等。

@2.5.7.12 函数和可调用对象 Functional ：
扩展了标准库头 <functional> ，提供函数类型操作和各种一般调用的实现。

@2.5.7.13 通用指针 Pointer

@2.5.7.14 通用迭代器 Iterator ：
间接扩展了标准库头 <iterator> ，提供若干迭代器适配器和相关操作。

@2.5.7.15 迭代器特征 IteratorTrait ：
扩展标准库头 <iterator> ，提供迭代器相关的类型特征。

@2.5.7.16 泛型算法 Algorithm ：
扩展了标准库头 <algorithm> ，提供一些泛型算法。
除非另行约定，使用 first 和 last 为名称的参数指定同一个范围，否则不保证结果正确，可能引起未定义行为。

@2.5.7.17 ISO C++ 标准字符串扩展 String ：
间接扩展了标准库头 <string> ，提供 std::char_traits 的扩展功能和对 std::basic_string 及类似类型的操作。

@2.5.7.18 ISO C 宽字符分类操作扩展 CWideCharacterType ：
头文件扩展了标准库头 <cwctype> ，提供一些替代实现。

@2.5.7.19 数组操作 Array ：
扩展了标准库头 <array> ，提供内建数组和 std::array 相关类型的操作。

@2.5.7.20 集合容器 Set ：
扩展标准库头 <map> ，但提供和 std::set 类似的容器。

@2.5.7.21 ISO C++ 标准流缓冲扩展 StreamBuffer ：
扩展了标准库头 <streambuf> 。

@2.5.7.22 ISO C++ 标准输入流扩展 InputStream ：
扩展了标准库头 <istream> 。

@2.5.7.23 ISO C 标准输入/输出扩展 CStandardIO ：
头文件扩展了标准库头 <cstdio> ，提供 C/C++ 流操作模式参数的转换和 C 标准库输入的迭代器包装。

@2.5.7.24 ISO C++ <future> 扩展 Future ：
扩展了标准库头 <future> ，提供一些别名模板和便利接口。

@2.5.7.25 伪互斥量 PseudoMutex ：
提供单线程环境下互斥量和锁接口，作为标准库 <mutex> 的替代。

@2.5.8 其它扩展接口：
不被以上 YStandardEx 头文件依赖。

@2.5.8.1 C++ 类型操作检测 Examiner ：
使用元编程和模板匹配检查特定类型是否存在特定操作。

@2.5.8.2 C++ 转换模板 Cast ：
实现各种带类型限制的转换模板。

@2.5.8.3 通用容器操作 Container ：
实现通用容器适配器模板和对容器类型及构建数组容器的操作。
参数限制同 Algorithm (@2.5.7.16) 。

@2.5.8.4 枚举相关操作 Enum ：
提供枚举相关操作和类型。

@2.5.8.5 可选值包装类型 Optional ：
提供 Boost.Optional 和 WG21 N4081 提议的 ISO C++ std::experiment::optional 的类似的可选值包装。

@2.5.8.6 动态泛型类型 Any ：
主要提供 Boost.Any 和提议的 ISO C++ std::experiment::any 的类似的基于类型擦除实现的用于保存运行时确定类型的值的对象，默认使用和 libstdc++ 5 类似的小对象优化实现。
命名空间 any_ops 提供更多可供用户调整的内部接口。
提供了一些其它不和 any 类直接相关的类型擦除接口。
使用非零宏 YB_Use_LightweightTypeID 指定不依赖 RTTI 的 type_info 。

@2.5.8.7 动态泛型迭代器 AnyIterator ：
基于 ystdex::any(@2.5.8.6) 实现的用于保存运行时确定类型迭代器的对象。

@2.5.8.8 只读字符串视图 StringView ：
提供 WG21 N4081 提议的 ISO C++ std::experiment:: 的类似的可选值包装。

@2.5.8.9 基于类继承的混入接口 Mixin ：
提供基本的混入接口类型。

@2.5.8.10 间接和惰性求值 Thunk ：
提供组合惰性求值的可调用对象。

@2.5.8.11 作用域守护 ScopeGuard

@2.5.8.12 有理数运算 Rational ：
提供定点数模板等有理数算术类型接口。

@2.5.8.13 位段数据结构和访问 BitSegment ：
提供访问位集合的类型和操作。

@2.5.8.14 并发操作 Concurrency ：
提供线程池等实用并发特性。

@2.5.8.15 抽象路径模板 Path ：
提供抽象的路径模板及操作。

@2.5.8.16 高速缓冲容器模板 Cache ：
提供抽象的缓冲容器模板及操作。

@2.6 LibDefect ：
用于修正依赖的标准库实现因不完善或配置问题等与标准规定的接口的偏差。
和 YStandardEx 支持相同的语言标准。
除非另行说明，支持基本实现环境最低版本，参见 [Documentation::Dependencies @@1] 。
可能会因为更新而缺少兼容性，当前仅对最新环境进行测试。
可支持 libstdc++ 以外的 C++ 实现，但未测试。

@2.7 YTest ：
提供软件测试需要的一些功能的辅助库。

@2.7.1 Timing ：
计时相关的基础设施。可用于性能测试。

@3 API 设计和风格概述：
基本内容参见 [Documentation::Designation @@3] 。

@3.1 语言特性使用限制：

@3.1.1 重载 operator,
YBase 不重载 operator, ，也不对其它代码是否重载 operator, 做出假设。

@3.1.2 别名：
除了 LibDefect 可能实现兼容 ISO C++11 以前实现的代码外，不使用 typedef ，而用 using 别名声明代替。

@3.2 别名策略：
使用条件包含中的 using 声明引入新的声明替代部分其它声明时，公开的接口为所有分支的公共子集。
除非文档说明，在 namespace ystdex 及其 inline 的 ystdex::cpp*(@2.5.2.2) 内声明的名称，和 namespace std 同名的，提供的接口和被支持的最新分支接口在实体上兼容，对不依赖实现细节的实体的用户代码使用透明（即可替换实现），但不保证存在包含相同名称的所有实体（如不同的重载）。

@3.3 异常设计和使用规则：
基本内容参见 [Documentation::LanguageConvention @@5.10.5] 。
所有内部的异常类型继承 std::exception ，使用 catch(std::exception&) 满足无异常抛出保证([Documentation::LanguageConvention @@5.10.5.1.3]) 。
异常相关的 API 文档满足 [Documentation::Designation @6.1.2] 。
和标准库一致，异常的 what() 成员应返回一个 NTBS ，并符合以下规则和指引：
内容允许但不需要保证本地化，本地化内容应由文档说明；
通常应为完整的陈述句，不需要输出时附加后缀标点。

@3.3.1 异常安全保证：
除非文档说明，除以下例外的公开接口具有强异常安全保证([Documentation::LanguageConvention @@5.10.5.1.2]) ；
外部代码([Documentation::LanguageConvention @5.10.5.1.7]) 约定；
涉及程序外部可观察状态的同步操作（包括但不限于文件系统和硬件状态）。
除基本例外([Documentation::LanguageConvention @5.10.5.1.6]) 约定，（包括上述情形）所有公开接口具有基本异常安全保证([Documentation::LanguageConvention @@5.10.5.1.1]) 。

@3.3.2 抛出异常明确性：
在明确异常基类的基础上， YBase 保证 API 中抛出的异常在文档（若存在）中明确：不抛出被文档描述外的异常。
若实现在公开头文件可见，文档可仅指出异常中立而不需要明确具体异常；否则应明确异常类型。

@3.3.3 捕获异常明确性：
除非文档说明，不捕获调用用户代码时抛出的异常。

*/
////

