August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
在3.9.2节中,我们曾看过一个令人讨厌的错误:当我们给一个变量赋了一个“太大”的值后,这个值会被截断。例如:
这里x的值是2而不是2.9,因为x是整型,而整型没有小数部分,只有整数部分(这是显然的)。与之类似,如果我们使用ASCII字符集,c的值将是42(表示字符*),而不是1066,因为字符集中没有值为1066的字符。
在3.9.2节中,我们已经看到如何通过测试来确保截断错误不发生。有了异常(和模板,参见14.3节),我们可以编写函数来测试能够引起值改变的赋值或初始化操作,有错误发生时,抛出runtime_error异常。例如:
这里<…>的用法与vector<int>中的尖括号相同。当需要确定一个类型而不是数值时,我们可以这样使用。它被称为模板参数(template parameter)。当需要进行类型转换,而不确定数值“是否适合”目标类型时,我们可以使用narrow_cast。它是在std_lib_facilities.h中定义并用error()实现的。单词cast的意思是“类型转换”,它暗示进行转换的对象是有问题的(就像对一条断腿固定石膏模一样)。需要注意的是,类型转换并不会改变操作数,而是生成了一个所要求类型的新数值。