2013-03-31 13 views
6

Dlaczego pierwszy wiersz w głównych kompilacjach, ale drugi nie? Oba są uzupełnienia tymczasowe myślę ale traktowany jest jako l-wartość, a nie inny ..jest tymczasową wartością l, czy też nie?

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); 
} 

Odpowiedz

2

W przypadku typów klas operator przypisania jest funkcją składową. Oznacza to, że a = b to po prostu cukier syntetyczny dla a.operator=(b). I całkiem dobrze jest wywoływać funkcje członkowskie na tymczasowych.

Należy pamiętać, że w języku C++ termin lwartość nie ma nic wspólnego z lewą stroną zadania. Jak pokazuje Twój przykład, idealnie nadaje się do przypisywania rwartościom typu klasy. Istnieją również lwartości, których nie można przypisać, na przykład tablice i/lub stałe, zwłaszcza literały łańcuchowe.

+0

tak! Myślę, że to jest argument, którego mi brakowało ... operator = może być wywołany na wartościach r, ale "przypisania" nie można wykonać na wartościach r – mhk

0

Jeśli nie tworzyć operator przypisania, kompilator utworzy jeden dla Ciebie. Oznacza to, że tworzysz dwa tymczasowe i przypisujesz jeden do drugiego, a następnie oba są odrzucane.

+0

Nie widzę związku z pytaniem! – Ajay

0

Nie, drugi nie jest tymczasowy. Czasowy to coś, co ma (w większości ograniczone) życie i ma region pamięci, w którym żyje przez okres swojego życia.

A char() nie ma żadnej z nich. Dlatego takie wyrażenia nie mogą być przypisane. Nie jest jasne, co zadanie zmienia z punktu widzenia języka. Czy później 2 będzie równa 0?

Powiązane problemy