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