2013-02-28 38 views
0

web site cplusplus documentation为的std :: string构造以两个输入迭代状态部分:什么是std :: string(itr,itr)应该这样做?

副本的字符的范围在[第一,最后的序列),以相同的顺序。

第一个,最后一个: 将迭代器输入到范围中的初始位置和最终位置。使用的范围是[first,last),它包含first和last之间的所有字符,包括first指向的字符,但不包含last指向的字符。

这是什么意思在退化情况下first == last?一方面包含first,另一方面last被排除在外?官方的C++标准在这种情况下应该发生什么?应抛出异常吗?

+0

空字符串的构造不是这样一个退化的情况。 – 2013-02-28 18:17:24

+2

* *文档没有说明。 – 2013-02-28 18:18:04

+0

@WilliamKF:cplusplus.com不是“The”文档。这是某人对文档的总结。有些人在网站的准确性方面也存在问题,尽管海事组织似乎已经修复了大部分错误。 – 2013-02-28 18:22:57

回答

4

我不知道它是什么文件,你正在阅读,但标准说(§21.4.2/ 15):

[..]的范围0123构建从值的字符串,如在序列要求,表

并且序列要求表(表100)限定X a(i, j)指示一个有效的范围[i, j)为:

构造一个序列容器等于范围[i, j)

范围是有效当第二个迭代器可从第一个迭代器(通过递增)到达时。对于两个相等的迭代器,范围是空的。见§24.2.1/ 7:

范围是一对指定的计算的开始和结束时的迭代器。范围[i,i)是空的范围;通常,范围[i,j)指的是数据结构中的元素,从i指向的元素开始,直到但不包括j指向的元素。当且仅当ji到达时,范围[i,j)有效。将库中的函数应用于无效范围的结果未定义。

所以如果first == last,如你所说,你会得到一个空字符串。如果last无法从first到达,则表明您的行为未定义。

3

范围是空的,所以没有什么可复制的。结果是一个空字符串。

2

这是什么意思在第一次==最后的退化情况?

这意味着输入范围是空的,所以字符串将是空的。

标准说在这种情况下应该发生什么?

C++ 11 24.2.1/7说:

一系列[i,i)是一个空的范围

0

我已经多次使用它的一件事是从一个大C风格字符串(const char*)中的子字符串构造一个std::string。你可以传递两个const char*指针,它会从第一个指针开始的字符和第二个指针前面的字符构造一个字符串。如果first == last,结果是一个空字符串。如果first > last,行为是未定义的(感谢Mooing Duck)

+3

这是未定义的行为,不需要抛出异常 – 2013-02-28 18:21:47

+0

已更正。谢谢! – 2013-03-01 06:17:06