如http://ideone.com/RdINqa所示,std::stoul不会std::out_of_range为负数投掷,而是将它们包裹起来.为什么是这样?似乎-4超出了类型的范围,unsigned long所以它应该抛出.
Igo*_*nik 12
21.5数字转换
unsigned long stoul(const string& str, size_t *idx = 0, int base = 10);效果: ... call [s]
strtoul(str.c_str(), ptr, base)...返回转换后的结果(如果有的话).抛出: ...
out_of_range如果转换后的值超出了返回类型的可表示值范围.
这里的"转换值"是返回的值strtoul.当然,这是类型的unsigned long,因此不能超出返回类型的可表示值的范围stoul,这也是unsigned long.
据我所知,只能stoi扔out_of_range,因为它返回int但使用strtol返回long.
此外,C标准指定的方式strtoul,需要接受字符串"-4"并返回等于的值-(unsigned long)4.我不知道为什么用这种方式指定.