如何理解c++中的引用折叠

发布网友

我来回答

1个回答

热心网友

感觉上叫引用坍塌好理解点(reference-collapsing
rules)

就这样
A& & 变成 A&
A& && 变成 A&
A&& & 变成 A&
A&& && 变成 A&&

就是左值引用会传染,只有纯右值&& && = &&,沾上一个左值引用就变左值引用了
引用折叠的规则上面的各位已经说得很清楚了,我在这里补充下引用折叠是为什么出现的吧。
要说引用折叠,首先得说右值引用(在看这个之前需要了解C++11中左值,右值的概念)。它是c++11出现的新概念,声明类型的方法是:T&&,具体信息可以看下面的代码:
Class A
{
A()
{// do something}
};

A GetA()
{
return A();
}

int main()
{
A a1 = GetA(); // a1是左值
A&& a2 = GetA(); // a2是右值引用
return 0;
}

a1是左值,在构造时使用了GetA() 产生的临时对象,之后GetA()产生的临时对象会销毁。
a2是右值引用,其指向的就是GetA()所产生的对象,这个对象的声明周期是和a2的声明周期是一致的。即少了临时对象,从而省去了临时对象的构造和析构。

热心网友

感觉上叫引用坍塌好理解点(reference-collapsing
rules)

就这样
A& & 变成 A&
A& && 变成 A&
A&& & 变成 A&
A&& && 变成 A&&

就是左值引用会传染,只有纯右值&& && = &&,沾上一个左值引用就变左值引用了
引用折叠的规则上面的各位已经说得很清楚了,我在这里补充下引用折叠是为什么出现的吧。
要说引用折叠,首先得说右值引用(在看这个之前需要了解C++11中左值,右值的概念)。它是c++11出现的新概念,声明类型的方法是:T&&,具体信息可以看下面的代码:
Class A
{
A()
{// do something}
};

A GetA()
{
return A();
}

int main()
{
A a1 = GetA(); // a1是左值
A&& a2 = GetA(); // a2是右值引用
return 0;
}

a1是左值,在构造时使用了GetA() 产生的临时对象,之后GetA()产生的临时对象会销毁。
a2是右值引用,其指向的就是GetA()所产生的对象,这个对象的声明周期是和a2的声明周期是一致的。即少了临时对象,从而省去了临时对象的构造和析构。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com