2013-03-31 112 views
6

爲什麼第一行主編譯但第二行沒有? 兩者都是臨時工,我認爲只有一個被視爲L值和其他不..是否是一個臨時的l值?

class complex 
{ 
    public: 
    complex() : r(0),i(0) {} 
    complex(double r_, double i_) : r(r_), i(i_) 
    { 

    } 

    private: 
    double r; 
    double i; 
}; 

int main() 
{ 
    complex(2,2) = complex(1,2); 
    char() = char(2); 
} 

回答

2

在類類型上,賦值運算符是一個成員函數。也就是說,a = b只是a.operator=(b)的合成糖。調用臨時對象的成員函數是完全正確的。

請注意,在C++中,術語的左值與作業的左側無關。如你的例子所示,分配類類型的右值是完全正確的。此外,還有一些你不能分配的左值,例如數組和/或常量,尤其是字符串文字。

+0

是的!我認爲這是我失蹤的論點... operator =可以在右值上調用,但「賦值」不能在右值 – mhk

0

如果不創建一個賦值操作符,編譯器會爲您創建一個。這意味着您創建了兩個臨時對象,並將其中一個指派給另一個,然後它們都被丟棄。

+0

我沒有看到問題的相關性! – Ajay

0

不,第二個不是臨時的。臨時是一種(大部分是有限的)生命週期,並且在其生命週期中存在一個存儲區域。

A char()既沒有這些。因此,這些表達方式被禁止分配。從語言的角度來看,分配的內容並不清楚。隨後2等於0