坚持 const 正确性,您可能希望使您的本地对象类型为 unique_ptr const 如下所示,而 T这里是一些不重要的类型:
unique_ptr<T> foo() {
const unique_ptr<T> p = make_unique<T>(...);
... using p's pointee ...
return p;
}
不幸的是它没有编译,因为返回值无法初始化,因为unique_ptr自p 以来没有复制构造函数并且 move 构造函数不可行是常量。
如果 C++ 标准规定当 return 语句的“操作数”是一个自动对象时,那么它潜在的常量性将被忽略怎么办?返回值初始化后不能引用自动对象,因此它的常量性现在无关紧要。在其析构函数中,也可以修改 const 对象,因此它实际上只是定义常量结束的位置:就在析构函数之前,或者在这种特殊情况下,在返回值的构造函数之前。
然而,“无法被引用”并不是全部事实:在初始化返回值之后排序的其他局部变量的析构函数可能会引用它。但是我认为他们不可能关心 const 对象被修改了。他们通过指针或对 const 的引用来了解对象,即从他们的角度来看,他们只知道不允许修改它,他们不知道是否允许其他人修改它。
您认为对 C++ 标准进行这样的更改是个好主意吗?或者除了我在下面给出的解决方案之外,您还看到其他解决方案吗?
仅作记录:非解决方案和其他解决方案:
return unique_ptr<T>(p.get())因为现在你有两个unique_ptr s,每个人都认为它是唯一的所有者。return unique_ptr<T>(p.release())自 p是 const 和 release()是非常量成员方法。return move(p)没有用,因为它没有删除常量,因此仍然无法调用 move 构造函数。return const_cast<unique_ptr<T>&&>(p)不是解决方案,因为修改 const 对象是未定义的行为(标准 N4140 中的 7.1.6.1 p4)。最佳答案
由于 unique_ptr 是一个只能 move 的类型,按值返回将(假设地)为返回值调用 move 构造函数。 但由于从中移出是一种破坏性操作,因此您不能真正从 const 对象中移出。
但我认为 C++17 的“保证复制省略”(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html)会对此有所帮助。 基本上,这将允许不可 move 的类型通过函数的值返回,例如您的 const unique_ptr。 再一次,我担心您将不得不等待新标准
关于c++ - 返回值的初始化应该忽略自动对象的常量性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35328029/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象