C++ 为什么一个左值可以被传递到一个采用常量ref右值的构造函数中?
例如:C++ 为什么一个左值可以被传递到一个采用常量ref右值的构造函数中?,c++,C++,例如: #include <iostream> #include <cstring> using namespace std; struct Square { Square() { str = new char[10]; strcpy(str, "Hello"); } ~Square() { delete str; } void print() {
#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=‘你好’
str='
在foo的构造函数中,它需要一个对Square&的右值,但传入的是Square&左值。为什么这样做?这是由于。sqref&其中sqref是T&折叠为T&
这是由于。sqref&其中sqref是T&折叠为T&
它根据C++11中的规则工作。
简单地说,我们不能创建对值的引用。因此,“引用到引用”会按照以下规则崩溃
Val&&&&->Val&&
Val&&&->Val&
Val&&->Val&
Val&&&->Val&
因此,在您的情况下,sqref&&它是平方的&&&折叠为平方的&。因此,这是正常的左值引用。它根据C++11中的规则工作。
简单地说,我们不能创建对值的引用。因此,“引用到引用”会按照以下规则崩溃
Val&&&&->Val&&
Val&&&->Val&
Val&&->Val&
Val&&&->Val&
因此,在您的情况下,sqref&&它是平方的&&&折叠为平方的&。所以这是正常的左值引用。您确定第二个输出是'?你错过了一个吗?奇怪的是,这就是输出。将此复制并粘贴到c++14版本以进行复制。我认为像您那样指定&&引用并不能保证原始对象的有效性。但更重要的是,你预期会发生什么?输出似乎与代码匹配。我刚才看到您使用了char*。0终止它,可能会将活动扳手抛出到输出中。试试其他值会发生什么情况。我希望编译器会警告没有匹配的构造函数,并且在最接近的候选值中,可以将左值分配给右值引用。您确定第二个输出是'?你错过了一个吗?奇怪的是,这就是输出。将此复制并粘贴到c++14版本以进行复制。我认为像您那样指定&&引用并不能保证原始对象的有效性。但更重要的是,你预期会发生什么?输出似乎与代码匹配。我刚才看到您使用了char*。0终止它,可能会将活动扳手抛出到输出中。试试其他值会发生什么。我希望编译器警告没有匹配的构造函数,并且在最接近的候选值中,可以将左值分配给右值引用。是的,这很有意义。mpark比你快了1分钟找到了答案——尽管如此,还是要谢谢你:是的,这是有道理的。mpark比你快了1分钟找到了答案-尽管如此,还是要感谢你: