【问题标题】:What is std::string(itr, itr) supposed to do?std::string(itr, itr) 应该做什么?
【发布时间】:2013-02-15 01:28:03
【问题描述】:

std::string 构造函数的web site cplusplus documentation 部分采用两个输入迭代器状态:

以相同的顺序复制 [first,last) 范围内的字符序列。

首先,最后: 输入迭代器到范围内的初始和最终位置。使用的范围是[first,last),包括first和last之间的所有字符,包括first指向的字符但不包括last指向的字符。

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

【问题讨论】:

  • 空字符串的构造并不是这样的退化情况。
  • 文档没有这么说。
  • @WilliamKF:cplusplus.com 不是“The”文档。那是某人对文档的摘要。有些人对该网站的准确性也有疑问,尽管 IMO 他们似乎已经修复了大部分错误。

标签: c++ iterator language-lawyer stdstring


【解决方案1】:

我不知道您正在阅读什么文档,但标准说(§21.4.2/15):

[..] 从[begin, end) 范围内的值构造一个字符串,如序列要求表中所示

序列要求表(表 100)将 X a(i, j) 定义为有效范围 [i, j) 为:

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

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

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

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

【讨论】:

    【解决方案2】:

    范围为空,因此没有可复制的内容。结果是一个空字符串。

    【讨论】:

      【解决方案3】:

      在 first == last 的退化情况下,这意味着什么?

      表示输入范围为空,所以字符串为空。

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

      C++11 24.2.1/7 说:

      范围[i,i) 是一个空范围

      【讨论】:

        【解决方案4】:

        我已经多次使用它的一件事是从大型 C 风格字符串 (const char*) 中的子字符串构造 std::string。您可以向它传递两个const char* 指针,它将从第一个指针开始到第二个指针之前的字符构造一个字符串。

        如果first == last,则结果为空字符串。如果first > last,则行为未定义(感谢 Mooing Duck)

        【讨论】:

        • 这是未定义的行为,不需要抛出异常
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-26
        • 1970-01-01
        • 2011-02-23
        相关资源
        最近更新 更多