gpt4 book ai didi

c++ - 为什么在 const 引用生命周期是当前范围的长度时使用 const 非引用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:37 30 4
gpt4 key购买 nike

因此在 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com