【发布时间】:2014-04-04 13:40:25
【问题描述】:
今天我通过了这个 SO 问题:Legality of COW std::string implementation in C++11
对该问题投票最多的答案(35 个赞成票)是:
这是不允许的,因为根据标准 21.4.1 p6,失效 迭代器/引用只允许用于
——作为任何标准库函数的参数,引用 以非常量 basic_string 作为参数。
——调用非常量成员函数,除了 operator[], at, front, 返回、开始、重新开始、结束和结束。
对于 COW 字符串,调用非常量 operator[] 需要创建一个 复制(并使引用无效),这是不允许的 上段。因此,在其中包含 COW 字符串不再合法 C++11。
我想知道这个理由是否有效,因为似乎 C++03 对字符串迭代器无效有类似的要求:
引用 a 元素的引用、指针和迭代器 basic_string 序列可能会因以下用途而失效 基本字符串对象:
- 作为非成员函数 swap() (21.3.7.8)、operator>>() (21.3.7.9) 和 getline() (21.3.7.9) 的参数。
- 作为 basic_string::swap() 的参数。
- 调用 data() 和 c_str() 成员函数。
- 调用非常量成员函数,除了 operator[]()、at()、begin()、rbegin()、end() 和 rend()。
- 在上述任何使用之后,除了返回迭代器的 insert() 和 erase() 的形式,第一次调用非常量成员 函数 operator[]()、at()、begin()、rbegin()、end() 或 rend()。
这些与 C++11 的不完全相同,但至少与 operator[]() 的部分相同,原始答案将其作为主要理由。所以我想,为了证明 C++11 中 COW std::string 实现的非法性,需要引用其他一些标准要求。这里需要帮助。
这个 SO 问题已经有一年多没有活跃了,所以我决定将其作为一个单独的问题提出。如果这不合适,请告诉我,我会找到其他方法来消除我的疑问。
【问题讨论】:
-
C++03 中引用段落下方的注释指出规则打算允许 COW 实现.. 我认为最后一个要点也有一个例外 第一次打电话给非会员
operator[],但不知怎么的,我发现这个表述很不清楚。 -
@dyp:是的,在 03 和 11 之间这些无效要求确实存在差异,这些差异意味着打算在 03 中使奶牛成为可能,在 11 中使奶牛成为不可能,但到目前为止我还不能找出逻辑链,至少不是链接的 SO 问题的原始答案中所说的。我会尝试阅读您和 pmr 提供的 open-std 文档,看看我是否能得到一些想法。
-
我认为(但目前无法证明)C++03 允许第一次调用
operator[]来复制字符串并使任何引用到已调用operator[]的字符串。
标签: c++ string c++11 language-lawyer standard-library