对空std::string调用insert(0,字符串):未定义行为还是合法行为?
std::string insert(0, ...) 的行为解析
先看你给出的代码:
int main() { std::string s; s.insert(0, "123"); }
你原本预期这段代码会抛出如下异常:
libc++abi: terminating due to uncaught exception of type std::out_of_range: basic_string
但实际编译运行后得到了符合预期的结果,想确认这是合法行为还是未定义行为。
答案很明确:这是完全合法的标准行为,不属于未定义行为。
根据C++标准对basic_string::insert的规定,插入位置参数pos的合法取值范围是 0 ≤ pos ≤ size()。对于空字符串来说,size()的值是0,所以pos=0刚好落在合法区间内(等于size()的情况也是允许的,对应在字符串末尾插入,而空串的末尾和开头是同一个位置)。
只有当pos > size()时,这个函数才会抛出std::out_of_range异常。你之前的预期错误,是混淆了插入位置的合法上限——pos等于size()是完全合规的,并不会触发异常。
内容的提问来源于stack exchange,提问作者roulette01
相关产品推荐
相关产品推荐

