gpt4 book ai didi

c++ - (传统的,之前的 c++11 左值-)引用如何在 C++ 中工作

转载 作者:行者123 更新时间:2023-11-30 00:49:09 27 4
gpt4 key购买 nike

指针很简单。有一些内存保存着一个地址。要获得(有意义的)值,取消引用返回地址指向的内存中包含的值。

引用以某种方式做一些类似的事情:它们持有指向一个临时对象的“链接”。但是当我分配或使用引用时会发生什么?

#include <iostream>
using namespace std;
int one(){
return 1;
}
int main()
{
const int &rone = one();
cout << &rone << endl;
return 0;
}

为什么会这样?这个地址是临时对象的地址吗?

sh-4.2# g++ -std=c++11 -o main *.cpp
sh-4.2# main
0x7fff9d2a4e74

这个地址指向哪里?如果它指向神奇的临时对象,为什么我不能只执行以下操作。 (我很清楚它是一个右值,& 只接受左值,但为什么呢?)

int main()
{
cout << &one() << endl;
return 0;
}

我的问题超出了 c++ 的编程方面。它在技术方向上更多地意味着 C++ 在内部是如何工作的。我主要尝试在移动语义的上下文中理解右值引用,这需要理解那些传统引用(我几乎从不使用)。

最佳答案

另一种理解引用的方式是别名。绑定(bind)引用为对象提供了另一个名称。在 C++11 之前,这两个片段完全相同:

int a = 5;
int &b = a;

对比

int b = 5;
int &a = b;

此后,ab 都是同一对象的名称。 (C++11 引入了一种不对称性,因为 decltype 将在返回的类型中包含引用)。

这与您的第一个示例没有任何不同。您将 rone 绑定(bind)为临时对象的名称,语言规则表明这也会延长临时对象的生命周期。

在你的第二个例子中没有引用。地址运算符是与用于声明引用的符号不同的语言元素,尽管它们具有相同的拼写。这是非法的,因为语言定义表明地址运算符不能应用于创建临时对象的表达式。

关于c++ - (传统的,之前的 c++11 左值-)引用如何在 C++ 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29134433/

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