如图所示 http://ideone.com/RdINqa, std::stoul 不投掷 std::out_of_range 对于负数,但包裹它们。为什么是这样?似乎-4超出了该类型的范围 unsigned long 所以它应该抛出。
如图所示 http://ideone.com/RdINqa, std::stoul 不投掷 std::out_of_range 对于负数,但包裹它们。为什么是这样?似乎-4超出了该类型的范围 unsigned long 所以它应该抛出。
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 返回 long。
此外,C标准指定的方式 strtoul,它需要接受字符串 "-4" 并返回一个等于的值 -(unsigned long)4。我不知道为什么用这种方式指定。
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 返回 long。
此外,C标准指定的方式 strtoul,它需要接受字符串 "-4" 并返回一个等于的值 -(unsigned long)4。我不知道为什么用这种方式指定。