- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据(优秀的)问题 C++ OutputIterator post-increment requirements ,我们观察到对于 OutputIterator
类型 X
的可取消引用和递增值 r
,以及适当类型的值 o
, 表达式
*r++ = o;
是有效的并且具有等同于
的语义X a(r);
++r;
*a = o;
但是,如果 r
在中间期间增加了不止一次,那么 a
是否仍然是可解引用赋值的?也就是说,这个代码有效吗?
X a(r);
++r;
++r;
*a = o;
很难看出对一个值的操作如何影响对另一个值的操作的有效性,但是例如InputIterator
(24.2.3) 在 ++r
的后置条件下有:
Any copies of the previous value of
r
are no longer required either to be dereferenceable or to be in the domain of==
.
相关部分:24.2.2 迭代器、24.2.4 输出迭代器、17.6.3.1 模板参数要求。
此外,如果这不需要是有效的,那么在任何情况下,利用它的无效性是否有助于OutputIterator
类型,同时仍遵守现有要求?
最佳答案
此问题于 2004 年作为 defect 485 提出,以及 n3066 中的措辞澄清了这个问题,要求输出迭代器只需要支持一系列交替增量和取消引用/赋值。因此,在您的示例中,r
不需要在第一个 ++r
之后递增,除非中间有取消引用/赋值。 SGI 的 STL 也要求此行为(见脚注 3)。正如您上面提到的,n3225 出现时没有 n3066 的修复,所以 defect 2035被抚养;但遗憾的是,该修复程序并未纳入已发布的 C++11 版本 (ISO/IEC 14882:2011)。
此外,缺陷 2035 表示 a
(来自 X a(r++);
)不能像 *a = 0
那样使用:
"After this operation [i.e., ++r
] r
is not required to be incrementable and any copies of the previous value of r
are no longer required to be dereferenceable or incrementable."
有些情况下这可能有助于实现(就简单性而言):参见例如this question在 ostream_iterator
上,忽略这种(无效的)双增量,只是返回 *this
;只有取消引用/赋值会导致 ostream_iterator
实际递增。
关于c++ - 对双倍递增的 OutputIterator 的取消引用赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11887104/
C++ 要求 OutputIterator 类型 X 支持 r++ 形式的表达式,其中 r 是 X。此后缀增量必须在语义上等同于: (*) { X tmp = r;++r;返回 tmp; } 并且必须
根据(优秀的)问题 C++ OutputIterator post-increment requirements ,我们观察到对于 OutputIterator 类型 X 的可取消引用和递增值 r,以
我在一篇关于 OutputIterator 的文章中读到,我们只能将其解引用为左值。我的问题是关于 operator++ 的,它将迭代器递增一个位置。 所以, *it++ = t 会是 {*it =
我正在玩概念并遇到障碍。或者也许只是我的思想被阻塞了。 我想创建一个缓冲“批量可读”数据源的类。这样的数据源应该有一个成员函数,该函数接受一个 OutputIterator 并具有如下签名: temp
我正在玩概念并遇到障碍。或者也许只是我的思想被阻塞了。 我想创建一个缓冲“批量可读”数据源的类。这样的数据源应该有一个成员函数,该函数接受一个 OutputIterator 并具有如下签名: temp
我正在玩概念并遇到障碍。或者也许只是我的思想被阻塞了。 我想创建一个缓冲“批量可读”数据源的类。这样的数据源应该有一个成员函数,该函数接受一个 OutputIterator 并具有如下签名: temp
我正在尝试编写一个接受 OutputIterator 并将值写入其中的 C++ 函数,但我遇到了各种问题。当我传入 list<> 迭代器时,列表未填充,当我传入 vector<> 迭代器时,出现段错误
第 1.3.2 节 here在 CGAL 文档中主张使用 OutputIterator 返回 convex_hull_2() 的结果,因为调用时容器为空,因此我们无法传递 result.begin()
函数模板 std::copy 的等价物是: template OutputIterator copy (InputIterator first, InputIterator last, Output
我正在使用 CGAL 的 Kd 树实现以及模糊球体作为查询对象,以获取以点为中心的半径为 r_max 的球体中包含的点。这是这个最小的工作示例: #include #include
我创建了一个简单的不可变双向迭代器: #include #include #include #include #include class my_iterator : public std:
我正在为自定义容器定义迭代器。迭代器实现了 InputIterator 和 OutputIterator 概念。 iterator::reference 和 const_iterator::refer
(此问题与 Why does std::max_element require a ForwardIterator? 具有相同的“问题模板”,但答案必须不同,因为 std::fill 不会将迭代器返回
我是一名优秀的程序员,十分优秀!