- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
因此在 C++ 中,如果将函数的返回值分配给 const 引用,则该返回值的生命周期将是该引用的范围。例如
MyClass GetMyClass()
{
return MyClass("some constructor");
}
void OtherFunction()
{
const MyClass& myClass = GetMyClass(); // lifetime of return value is until the end
// of scope due to magic const reference
doStuff(myClass);
doMoreStuff(myClass);
}//myClass is destructed
因此,无论您通常将函数的返回值分配给 const 对象,您似乎都可以将其分配给 const 引用。在函数中是否有过这样的情况,您不想在赋值中使用引用而是使用对象?你为什么要写这行:
const MyClass myClass = GetMyClass();
编辑:我的问题让一些人感到困惑,所以我添加了 GetMyClass 函数的定义
编辑 2:如果您还没有阅读以下内容,请不要尝试回答问题: http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/
最佳答案
如果函数返回一个对象(而不是引用),则有必要在调用函数中制作一个拷贝[尽管可能会采取优化步骤,这意味着该对象将直接写入结果存储中,拷贝将在该存储中结束,根据“好像”原则]。
在示例代码中 const MyClass myClass = GetMyClass();
这个“复制”对象被命名为 myclass
,而不是一个存在但不存在的临时对象命名(或可见,除非您查看机器代码)。换句话说,无论你是否为它声明一个变量,在调用 GetMyClass
的函数中都会有一个 MyClass
对象 - 这只是你是否创建它的问题可见与否。
编辑2:const
引用解决方案看起来很相似(不完全相同,这实际上只是为了解释我的意思,你实际上不能这样做):
MyClass __noname__ = GetMyClass();
const MyClass &myclass = __noname__;
只是编译器在幕后生成了 __noname__
变量,实际上并没有告诉你。
通过使 const MyClass myclass
对象可见并且很清楚发生了什么(并且 GetMyClass
返回对象的 COPY,而不是引用一些已经存在的对象)。
另一方面,如果 GetMyClass
确实返回了一个引用,那么这肯定是正确的做法。
在某些编译器中,使用引用甚至可能在使用对象时添加额外的内存读取,因为引用“是一个指针”[是的,我知道,标准没有这么说,但请在提示之前, 帮我一个忙,给我看一个编译器,它不会将引用实现为指针,并添加额外的糖来让它们尝起来更甜],所以要使用引用,编译器应该读取引用值(指向对象的指针),然后从该指针读取对象内部的值。在非引用的情况下,对象本身被编译器“已知”为直接对象,而不是引用,从而节省了额外的读取。当然,大多数编译器都会在大多数时候优化这样的额外引用,但它并不总是这样做。
关于c++ - 为什么在 const 引用生命周期是当前范围的长度时使用 const 非引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18143604/
我不能解决这个问题。和标题说的差不多…… 如果其他两个范围/列中有“否”,我如何获得范围或列的平均值? 换句话说,我想计算 A 列的平均值,并且我有两列询问是/否问题(B 列和 C 列)。我只希望 B
我知道 python 2to3 将所有 xrange 更改为 range 我没有发现任何问题。我的问题是关于它如何将 range(...) 更改为 list(range(...)) :它是愚蠢的,只是
我有一个 Primefaces JSF 项目,并且我的 Bean 注释有以下内容: @Named("reportTabBean") @SessionScoped public class Report
在 rails3 中,我在模型中制作了相同的范围。例如 class Common ?" , at) } end 我想将公共(public)范围拆分为 lib 中的模块。所以我试试这个。 module
我需要在另一个 View 范围 bean 中使用保存在 View 范围 bean 中的一些数据。 @ManagedBean @ViewScoped public class Attivita impl
为什么下面的代码输出4?谁能给我推荐一篇好文章来深入学习 javascript 范围。 这段代码返回4,但我不明白为什么? (function f(){ return f(); functio
我有一个与此结构类似的脚本 $(function(){ var someVariable; function doSomething(){ //here } $('#som
我刚刚开始学习 Jquery,但这些示例对我帮助不大...... 现在,以下代码发生的情况是,我有 4 个表单,我使用每个表单的链接在它们之间进行切换。但我不知道如何在第一个函数中获取变量“postO
为什么当我这样做时: function Dog(){ this.firstName = 'scrappy'; } Dog.firstName 未定义? 但是我可以这样做: Dog.firstNa
我想打印文本文件 text.txt 的选定部分,其中包含: tickme 1.1(no.3) lesson1-bases lesson2-advancedfurther para:using the
我正在编写一些 JavaScript 代码。我对这个关键字有点困惑。如何在 dataReceivedHandler 函数中访问 logger 变量? MyClass: { logger: nu
我有这个代码: Public Sub test() Dim Tgt As Range Set Tgt = Range("A1") End Sub 我想更改当前为“A1”的 Tgt 的引
我正忙于此工作,以为我会把它放在我们那里。 该数字必须是最多3个单位和最多5个小数位的数字,等等。 有效的 999.99999 99.9 9 0.99999 0 无效的 -0.1 999.123456
覆盖代码时: @Override public void open(ExecutionContext executionContext) { super.open(executio
我想使用 preg_match 来匹配数字 1 - 21。我如何使用 preg_match 来做到这一点?如果数字大于 21,我不想匹配任何东西。 example preg_match('([0-9]
根据docs range函数有四种形式: (range) 0 - 无穷大 (range end) 0 - 结束 (range start end)开始 - 结束 (range start end st
我知道有一个UISlider,但是有人已经制作了RangeSlider(用两个拇指吗?)或者知道如何扩展 uislider? 最佳答案 我认为你不能直接扩展 UISlider,你可能需要扩展 UICo
我正在尝试将范围转换为列表。 nums = [] for x in range (9000, 9004): nums.append(x) print nums 输出 [9000] [9
请注意:此问题是由于在运行我的修饰方法时使用了GraphQL解析器。这意味着this的范围为undefined。但是,该问题的基础知识对于装饰者遇到问题的任何人都是有用的。 这是我想使用的基本装饰器(
我正在尝试创建一个工具来从网页上抓取信息(是的,我有权限)。 到目前为止,我一直在使用 Node.js 结合 requests 和 Cheerio 来拉取页面,然后根据 CSS 选择器查找信息。我已经
我是一名优秀的程序员,十分优秀!