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分钟找到了答案-尽管如此,还是要感谢你: