August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
与我们的vector类似,大多数标准库vector实现不对下标运算符([])进行范围检查,但在at()中提供范围检查。那么我们程序中的std::out_of_range异常是从何而来呢?本质上,我们选择了14.4.1节中的“选项4”:vector的实现不必对[]进行范围检查,但这么做也是允许的,因此我们的代码处理了这种情况。你使用的是我们的调试版本Vector,它对[]进行了范围检查。这是我们开发代码过程中采用的版本。虽然这一版本会牺牲小部分程序性能,但它有助于减少程序错误和调试时间:
通过使用Range_error,我们能够对元素的越界索引进行调试。由于派生自std::vector,因此Vector获得了vector的所有成员函数。第一个using为std::vector的size_type引入了一个便利的别名;参见15.5节。第二个using将vector的所有构造函数都引入了Vector。
在调试复杂程序时这个Vector版本是十分有用的。另一种替代方法是使用带系统的范围检查的完整标准库vector实现——实际上,这可能就是你之前所做的;我们不可能准确地知道你的编译器和库提供了什么程度的范围检查(可能会超出C++标准的要求)。
在std_lib_facilities.h中,我们采用了一种糟糕的花招(宏替换),重新定义vector使之代表Vector:
这意味着每当你写下vector时,编译器看到的都会是Vector。这种花招很糟糕,因为你所看到的代码与编译器所见的代码并不相同。在实际代码中,宏是晦涩错误的一个重要来源(参见27.8节和附录A.17)。 ...