std :: string构造函数的web site cplusplus documentation在两部分中采用两个输入迭代器状态:
以相同的顺序复制[first,last]范围内的字符序列。
第一个,最后一个: 将迭代器输入到范围中的初始位置和最终位置。使用的范围是[first,last),包括first和last之间的所有字符,包括第一个指向的字符,但不包括last指向的字符。
在first == last
的退化情况下,这意味着什么?一方面first
被包含在另一方last
被排除在外?在这种情况下,官方C ++标准应该说什么呢?是否应该抛出异常?
答案 0 :(得分:4)
我不知道你正在读什么文件,但标准说(§21.4.2/ 15):
[..]根据
[begin, end)
范围内的值构造一个字符串,如序列要求表中所示
序列要求表(表100)将X a(i, j)
定义为有效范围[i, j)
:
构造一个等于范围
的序列容器[i, j)
当第二个迭代器从第一个迭代器到达时(通过递增),范围是有效。对于两个相等的迭代器,范围为空。见§24.2.1/ 7:
范围是一对指定计算开始和结束的迭代器。范围
[i,i)
是一个空范围;通常,范围[i,j)
是指数据结构中的元素,以i
指向的元素开头,但最多但不包括j
指向的元素。当且仅当[i,j)
可以从j
访问时,范围i
才有效。将函数库中的函数应用于无效范围的结果是未定义的。
所以如果first == last
如你所说,你会得到一个空字符串。如果无法从last
访问first
,则表示您有未定义的行为。
答案 1 :(得分:3)
范围是空的,因此无需复制。结果是一个空字符串。
答案 2 :(得分:2)
这在堕落的情况下意味着什么?= = last?
这意味着输入范围为空,因此字符串将为空。
在这种情况下标准会说什么?
C ++ 11 24.2.1 / 7说:
范围
[i,i)
是空范围
答案 3 :(得分:0)
我多次使用它的一件事是从大型C风格字符串(std::string
)中的子字符串构造const char*
。你可以传递两个const char*
指针,它将从第一个指针开始的字符构造一个字符串,并在第二个指针之前结束一个字符串。
如果first == last
,结果为空字符串。如果first > last
,行为未定义(感谢Mooing Duck)