为什么左值可以传递给构造函数采用const ref rvalue?

时间:2018-05-29 07:23:02

标签: c++

例如:

#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 &左值。为什么这样做?

2 个答案:

答案 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 collapsingsqref&& sqref T&折叠为T&的{​​{1}}。

https://wandbox.org/permlink/eWeYLdI3l0vSpNvo