为什么std :: stoul会转换负数?

Kal*_*Kal 12 c++ c++11

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.

据我所知,只能stoiout_of_range,因为它返回int但使用strtol返回long.

此外,C标准指定的方式strtoul,需要接受字符串"-4"并返回等于的值-(unsigned long)4.我不知道为什么用这种方式指定.