例如:
#include <iostream>
#include <cstring>
using namespace std;
struct Square
{
Square()
{
str = new char[10];
strcpy(str, "Hello");
}
~Square()
{
delete str;
}
void print()
{
cout << "str = '" << str << "'" << endl;
}
char * str;
};
class foo
{
public:
typedef const Square & sqcref;
typedef Square & sqref;
foo(sqref && _ref)
{
fooStr = _ref.str;
_ref.str = 0;
}
char * fooStr;
};
int main()
{
Square s;
s.print();
foo f(s);
s.print();
}
输出:
str =&#39;你好&#39;
str =&#39;
在foo
的构造函数中,它期望rvalue为Square &
,但传入的是Square &
左值。为什么这样做?
答案 0 :(得分:8)
它适用于C ++ 11中的reference collapsing规则。 简单地说,一个人无法创建对值的引用。因此,“引用参考”将遵循以下规则崩溃
Val&amp;&amp; &安培;&安培; - &GT; Val&amp;&amp;
Val&amp; &安培;&安培; - &GT; Val&amp;
Val&amp; &安培; - &GT; Val&amp;
Val&amp;&amp; &安培; - &GT; Val&amp;
因此,在您的情况下,sqref &&
(Square & &&
)会折叠为Square &
。所以这是正常的左值参考。
答案 1 :(得分:3)
这是由于reference collapsing。 sqref&&
sqref
T&
折叠为T&
的{{1}}。