jjzjj

C++ OutputIterator 后递增要求

coder 2023-11-15 原文

C++ 要求 OutputIterator 类型 X 支持 r++ 形式的表达式,其中 rX。此后缀增量必须在语义上等同于:

(*) { X tmp = r;++r;返回 tmp; }

并且必须返回可转换为 X const& 的类型。在 C++11 中,请参阅 24.2.4(但这不是新的)。在同一部分,它说

Algorithms on output iterators should never attempt to pass through the same iterator twice. They should be single pass algorithms.

给定 (*),上面,假设我复制返回值,如 X a(r++);

  1. 假设 r 在递增之前是可解引用的,但没有被解引用。是否要求 a 是可解引用的?如果是这样,必须 X a(r++); *a = t; 执行与 *r++ = t; 否则相同的赋值? ar 是否有任何(其他)条件?

  2. 否则,假设 r 在递增之前被取消引用/赋值,并且它的增量值(也)是可取消引用的。以下哪项(如果有的话)是明确定义的:(a) *a = t;, (b) ++a; *a = t;, (c) *r = t;?


另见后续:Dereference-assignment to a doubly incremented OutputIterator

最佳答案

正如您所注意到的,r++ 具有操作语义

X operator++(int) { X tmp = r; ++r; return tmp; }

我将返回值添加为 X 因为根据 24.2.2:2 Iterator 满足 CopyConstructible,所以复制是合法的将r++的返回值构造成X类型的实例。

接下来,要求*r++ = o有效;这不同于 { const X &a(r++); *一=o; }只是增加了一个序列点,与上面操作语义定义中的return tmp;之后的序列点合并,所以复合语句有与表达式语句具有相同的有效性。通过调用 CopyConstructible{ X a(r++); *一=o; 具有相同的有效性和操作语义。

在案例中

*r = o;
X a(r++);

以下内容:

  • (a) *a = o 无效,因为迭代器的那个值已经被解除引用分配;

  • (b) ++a; *a = o 无效,因为迭代器的值已经递增,违反了单遍要求,因为只有 r 的(新值)需要递增:根据 24.2.4:2 的注释,输出迭代器上的算法永远不应该 尝试两次通过同一个迭代器,尽管没有指定通过在此上下文中的含义;

  • (c) *r = o 是有效的,因为唯一的区别是 *r = o; r++; *r = o 总体上是 r 原始值的拷贝的继续存在,根据 CopyConstructible 要求对从中复制的值没有语义影响.

另一个有趣的问题是(对于非解引用分配的 r):

X a(r);
++r;
++r;
*a = o;

标准没有直接涵盖这一点,但从 CopyConstructible 看来它应该是有效的。

关于C++ OutputIterator 后递增要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11876128/

有关C++ OutputIterator 后递增要求的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  3. ruby - 使用 postgres.app 在 rvm 下要求 pg 时出错 - 2

    我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension

  4. ruby-on-rails - 带有 Zeus 的 RSpec 3.1,我应该在 spec_helper 中要求 'rspec/rails' 吗? - 2

    使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做

  5. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  6. ruby - 如何搜索、递增和替换 Ruby 字符串中的整数子字符串? - 2

    我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/

  7. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  8. ruby - 如何用递增的值填充数组 Ruby - 2

    我正在尝试解决http://projecteuler.net/problem=1.我想创建一个方法,它接受一个整数,然后创建一个包含它前面的所有整数的数组,并将整数本身作为数组中的值。以下是我目前所拥有的。代码不起作用。defmake_array(num)numbers=Array.newnumcount=1numbers.eachdo|number|numbers 最佳答案 (1..num).to_a是您在Ruby中需要做的全部。1..num将创建一个Range对象,以1开始并以任意值num结束是。Range对象有to_a方法通过

  9. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

  10. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

    出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

随机推荐