2013-03-31 29 views
6

Tại sao dòng đầu tiên trong biên dịch chính nhưng thứ hai thì không? Cả hai đều là tạm thời tôi nghĩ nhưng ai đối xử như l-giá trị và người kia không ..là giá trị l tạm thời hay không?

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

Trả lời

2

Trên các loại lớp, toán tử gán là hàm thành viên. Tức là, a = b chỉ là đường cú pháp cho a.operator=(b). Và nó là hoàn toàn tốt đẹp để gọi chức năng thành viên trên thời gian.

Xin lưu ý rằng trong C++, cụm từ lvalue không liên quan gì đến phía bên trái của bài tập. Như ví dụ của bạn thể hiện, nó là hoàn toàn tốt đẹp để gán cho rvalues ​​của loại lớp. Ngoài ra, có các giá trị mà bạn không thể gán cho, ví dụ mảng và/hoặc hằng số, đặc biệt là chuỗi ký tự.

+0

có! Tôi nghĩ rằng đây là đối số tôi đã bỏ lỡ ... toán tử = có thể được gọi trên rvalues ​​nhưng "chuyển nhượng" không thể được thực hiện trên rvalues – mhk

0

Nếu bạn không tạo một toán tử gán, trình biên dịch sẽ tạo ra cho bạn. Điều này có nghĩa là bạn tạo hai thời gian tạm thời, và gán một cái cho nhau, sau đó chúng đều bị loại bỏ.

+0

Tôi không thấy sự liên quan của câu hỏi! – Ajay

0

Không, số thứ hai không phải là tạm thời. Một tạm thời là một cái gì đó có một đời sống (chủ yếu là hạn chế) và có một khu vực lưu trữ nó sống trong thời kỳ sống của nó.

A char() không có trong số này. Do đó, các biểu thức như vậy bị cấm được chỉ định. Nó sẽ không được rõ ràng những gì chuyển nhượng sửa đổi từ một điểm ngôn ngữ của xem. Sau đó 2 có bằng 0 không?

Các vấn đề liên quan