这让我很困扰,我最近才重新接触c++,我很清楚参考文献。为什么下面的b和c似乎没有区别?换句话说,直觉上,我认为c不是一个ref变量会得到一个拷贝。它让我在考虑返回对局部变量的引用的问题时思考。
int a = 10;
int& func()
{
return a;
}
int &b = func();
int c = func(); // shouldn't this make a copy into c but c acts like a reference.
我认为
c
不是一个ref变量会复制。
c
确实是a
的副本。注意int c = func();
是copyinitialization而int &b = func();
是引用初始化.
这意味着如果您对c
进行了更改,它们将不会反映在a
上。演示
int a = 10;
int& func()
{
return a;
}
int &b = func(); //reference initialization
int c = func(); //copy initialization
int main()
{
c = 20;
std::cout << a<< " "<< b <<" "<< c <<std::endl; // 10 10 20
return 0;
}
还要注意"初始化"的强调。而不是"分配"。与其他语言(例如python)不同,这些术语在c++中具有不同的含义。
谢谢你的回答,现在明白了。这个问题开始于"为什么我不能返回一个局部变量引用到一个变量,如果它是一个副本?"嗯,我意识到,因为在那一点上已经太迟了,堆栈已经没有了。我在想可以在那堆东西消失之前复印——错了!你可以返回到一个引用,但是当你使用它的时候,段错误。返回到一个变量,并且,因为它试图复制,立即出现分段错误。
int& func() // compile warning
{
int a = 10;
return a;
}
int &b = func(); // ok, but segfault if try to use b.
int c = func(); // segfault immediately