gpt4 book ai didi

c++ - 引用地址是否总是等于原始地址?

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:59 26 4
gpt4 key购买 nike

这看起来是一个非常基础的主题,但对我来说非常重要。

下面的例子表明引用变量的地址等于原始变量的地址。我知道这是我们可以从 C/C++ 的概念中得到的期望。但是,是否总能保证这些地址在任何情况下都相等?

#include <iostream>
#include <vector>
#include <string>

class Point
{
public:
double x,y;
};

void func(Point &p)
{
std::cout<<"&p="<<&p<<std::endl;
}

int main()
{
std::vector<Point> plist;
plist.push_back({1.0,4.0});
plist.push_back({10.0,20.0});
plist.push_back({3.0,5.0});
plist.push_back({7.0,0.4});

std::cout<<"&plist[2]="<<&plist[2]<<std::endl;

func(plist[2]);

return 0;
}

结果:

&plist[2]=0x119bc90
&p=0x119bc90

最佳答案

Is always the address of a reference equal to the address of origin?

对象有地址。引用不是对象,并且(不一定)有地址。当 address-of 运算符应用于引用时,结果是引用对象的地址。

is it always guaranteed that these addresses are equal under any circumstance?

是的,这是有保证的(除非 address-of 运算符被愚蠢的实现重载)。

引用引用的对象与该引用引用的对象是同一对象。一个对象的地址与该对象的地址相同...因为它就是那个对象:)


现在,可以重载 addressof 运算符,使其不再返回该对象的实际地址。在这种情况下,这两次调用可能会产生不同的地址。演示:

struct evil {
static evil silly;
static bool insane;
evil* operator&() {
evil* bonkers = insane ? std::addressof(silly) : this;
insane = !insane; // does this mean it is no longer insane?
return bonkers;
}
};

bool evil::insane = true;
foo evil::silly;

int main() {
evil e;
evil& ref = e;
std::cout << &e << '\n';
std::cout << &ref << '\n';
std::cout << &ref << '\n';
}

可能的输出:

0x7ffffbeef42d
0x600dd1
0x7ffffbeef42d

关于c++ - 引用地址是否总是等于原始地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45821678/

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