作为新手,我发现C++书上关于函数返回的解释很晦涩。
这里总结一下自己的理解,希望大家指正:
场所:
T foo() {
...
return expr;
}
main() {
T var = foo();
}
我对返回流程的以下理解是否正确?
expr 的计算结果隐式转换为声明的函数返回类型T。此转换发生在内 foo();var。 欢迎任何意见!
最佳答案
让我们系统地解决这个问题。
如果一个函数被声明为T f();,并且T不是void,并且函数正常返回,那么它必须通过 return e; 形式的语句返回,其中 e 是一些表达式。
当您评估函数调用表达式 f() 时,您会获得一个值。假设 U 表示一个对象类型。如果 T = U & 或 T = U &&,则值为 U 类型,表达式 e必须能够绑定(bind)到引用,并且返回值是 e 的值。 (就其值类别而言,返回值也是所谓的“glvalue”)。在这种情况下没有其他事情发生。函数调用的值是返回的东西。
但是,当 T = U 时,f() 的值是所谓的“prvalue”(“纯右值”),这需要U 类型的临时对象 的构造。该对象如同由 U obj = e 构造(即从 e 隐式转换)。 f() 的值就是这个临时对象。它既可以用于初始化另一个对象(例如 U x = f();),也可以绑定(bind)到一个引用(例如 U && r = f();)。
返回表达式 e 到函数调用值的绑定(bind)发生在函数体范围内的最后一件事。值得注意的是,这是在作用域结束之前,即在作用域局部对象被销毁之前。例如,如果在构造返回值对象期间抛出异常,则必须在异常传递到调用作用域之前发生作用域展开以销毁本地对象。另一个有用的例子可能是使用作用域守卫,例如互斥锁:
U f()
{
std::locK_guard<std::mutex> lock(state_mutex);
return state.get_value();
}
这里我们假设初始化 U obj = state.get_value(); 是有意义的,我们进一步假设 state.get_value() 只能在state_mutex 被锁定。上面的代码正确而简洁地做到了这一点。
关于c++ - 检查我对函数返回的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24541077/
为什么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
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/