簡體   English   中英

為什么使用臨時 object 訪問時引用類型是左值?

[英]Why is a reference type an lvalue when accessed with a temporary object?

為什么將值分配給使用臨時 object 訪問的引用變量有效,但不適用於非引用類型?

class a
{
    public:
        int m;
        int &n;
        a():m(2),n(m)
        {
            cout<< "A's constructor"<<endl;
        }
};

int main()
{
    // a().m = 6; // this gives an error that a temporary object is being used 
                  // as an lvalue
    a().n = 20;   // But this line works

    return 0;
}

但是a().n真的是暫時的嗎? 考慮這段代碼:

class a
{
    public:
        int m;
        int &n;
        a():m(2),n(m)
        {
            cout<< "A's constructor"<<endl;
        }

        a(int& _n):m(2),n(_n)
        {
            cout<< "A's constructor"<<endl;
        }
};

int main()
{
    a().n = 20;   // (1)

    int n = 0;
    a(n).n        // (2)

    return 0;
}

(2)行清楚地表明.n不是臨時的。 它一定不是,因為它是對局部n變量的引用。

但是,編譯器無法知道n將引用什么。 甚至可以做n(rand_bool()? m: _n)並且它必須工作。

相反,編譯使用類型系統來知道應該分配什么。

例如,文字9int類型的 pr 值。 你不能分配給它:

9 = 8; // nope

在您的代碼中, a()是純右值或類型a 它的所有價值成員也都是。 這就是a().m不起作用的原因。 m是純右值。

但是, a().n是一個左值,因為n是一個左值引用。 不管它指向哪個變量。

a().n = 20;

因為n是左值引用類型,所以有效。 編譯器不知道n在實現中是對m的引用。 它假定n是一個有效的左值引用,因此接受該行。

理論上,當您分配給a().n時,您可以分配給一個獨立於a()生命周期的變量。 編譯器無法評估這一點,如果它不接受該行,它將妨礙程序員。 想象一下下面的用例:

// Global variable.
int gv;

class a
{
    public:
        int m;
        int &n;
        a():m(2), n(gv)  // n is a reference to the global variable.
        {
            cout<< "A's constructor"<<endl;
        }
};

int main()
{
    a().n = 20;   // Changes gv. It is a valid operation.
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM