发布网友
共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的声明周期是一致的。即少了临时对象,从而省去了临时对象的构造和析构。