目前我正在阅读 C++1y 论文,现在我正在尝试理解标题为 Improved insertion interface for unique-key maps 的 n3873 论文.该论文指出 insert 和 emplace 方法存在问题,它通过以下示例说明了该问题:
std::map<std::string, std::unique_ptr<Foo>> m;
m["foo"];
std::unique_ptr<Foo> p(new Foo);
auto res = m.emplace("foo", std::move(p));
在上面的代码之后,它表达了以下内容:
What is the value of
p? It is currently unspecified whetherphas been moved-from. (The answer is that it depends on the library implementation.)
好吧,我在寻找前面引用的解释时遇到了麻烦,主要是因为我找不到标准中指定在上面的代码中移动或不移动的位置 p是否定义了实现;寻找 n3690 standard关于 emplace(args) 的关联容器部分 (23.2.4) (插入一个 value_type 对象 t 用 std::forward<Args>(args) 构造)和 insert(t)方法只提到插入或放置值...
... if and only if there is no element in the container with key equivalent to the key of
t.
没有关于移动(或不移动)t 的消息值(value);另一方面,p托管内存无论如何都会被释放(如果它被移动 p 在不插入之后被释放,如果没有被移动被释放广告范围的末尾)不是吗?
介绍完后,让我提出以下问题:
p 发生了什么的例子?真的解脱了吗?如果问题看起来很愚蠢或答案很明显,请尽量原谅,这可能是因为我缺乏英语理解能力,或者因为我不习惯深入研究标准论文。任何指导将不胜感激。
最佳答案
Not a word about moving (or not)
这正是问题所在,未指定在什么条件下 mapped_type将被移动。
Why moving a value while inserting/emplacing it into an associative container which already have the inserted key, sets the value in an unspecified state?
没有什么可以阻止实现移动 unique_ptr首先进入一个临时变量,然后搜索键 "foo" .在这种情况下,无论 map 是否是否已经包含 key ,p == nullptr当调用 emplace返回。
相反,实现可以根据 key 是否存在有条件地移动。然后,如果 key 存在,p != nullptr当函数调用返回时。这两种方法同样正确,在第一种情况下,无法检索 p 的原始内容。即使插入永远不会发生,它也会在 emplace 之前被销毁返回。
建议emplace_stable()和 emplace_or_update()功能是使行为在所有情况下都可预测。
Where is worded that this operation is implementation-defined?
它未指定为实现定义的,它未指定,允许实现太多的自由度,可能导致并不总是合乎需要的行为。
What happens with the
pof the example? Is it really freed?
在示例中,您显示了 p 的内容不会被插入到 map 中(因为键 "foo" 已经存在)。但是p可能会也可能不会从调用 emplace 时移动返回。
在任何情况下都不会发生资源泄漏。如果执行无条件移动p它会将其移动到本地拷贝中,如果键存在则将其销毁,如果键不存在则将其插入到映射中。
另一方面,如果执行有条件地移动p ,它要么被插入到 map 中, 或 p emplace时将拥有它返回。在后一种情况下,它当然会在 p 时被销毁。超出范围。
关于c++ - std::map emplace/insert 正在插入的移动值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24156369/
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
如何将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.你能做的最好的事情是:
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么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”]、[“苹果”、“
我有一个模块:moduleMyModuledefdo_something#...endend由类使用如下:classMyCommandextendMyModuledefself.execute#...do_somethingendend如何验证MyCommand.execute调用了do_something?我已经尝试使用mocha进行部分模拟,但是当未调用do_something时它不会失败:it"callsdo_something"doMyCommand.stubs(:do_something)MyCommand.executeend 最佳答案