2010-06-03 51 views
5

Câu hỏi ban đầu liên quan đến toán tử quá tải = và tôi muốn chia sẻ kết quả tìm kiếm của tôi vì tôi không tìm thấy chúng. Tôi không thể tưởng tượng ví dụ hợp lý để sử dụng (a = b) làm lvalue. Với sự trợ giúp của IRC và google Tôi đã tìm thấy bài viết tiếp theo: http://msdn.microsoft.com/en-us/magazine/cc301415.aspxTại sao toán tử = trả về tham chiếu không const tham chiếu

nó cung cấp hai ví dụ.

(a=b)=c 

    f(T&); 
    f(a=b) 

nhưng cả hai đều không tốt và tôi tin rằng đó là thực hành không tốt. Điều thứ hai mang lại cho tôi cảm giác tương tự. Bạn có thể cung cấp nhiều ví dụ tốt hơn tại sao nó không phải là không liên tục?

Trả lời

11

Một lý do chính đáng là một trong những yêu cầu trong tiêu chuẩn cho một lớp X là sử dụng được trong các container tiêu chuẩn là sự biểu hiện a = b phải có loại X& (nơi a là một vế trái của loại Xb là một rvalue của loại X).

+0

Tốt bắt, giao phối :) –

+0

Cảm ơn! Nice shot. Tôi sẽ bỏ phiếu này. (Nhưng có lẽ điều này liên quan đến thực hành xấu trong STL. Bạn có thể đưa ra ví dụ C++ thuần túy không?) – outmind

+2

Nhưng tại sao vùng chứa cần một 'X &' là trả về? – kennytm

2

Tôi đã trải qua một thời gian và đây là ví dụ của tôi:

class A 
{ 
public: 
    const A& operator= (const A& a) {return *this;} 
}; 

int main(int argc, char* argv[]) 
{ 
    A a1; 
    A& a2 = a1; 
    A& a3 = (a2 = a1); 
} 

và đầu ra trình biên dịch: : lỗi C2440: 'khởi': không thể chuyển đổi từ 'const A' 'A &'

Tôi đã kiểm tra nó trên MS VS 2010, nhưng nó có đúng trên các nền tảng khác không? Và nếu ví dụ này là đủ điều kiện cho = là không const?

+1

Đồng thời biên dịch lỗi trên g ++. – kennytm

+0

Cảm ơn bạn! Ý tưởng của bạn về sự đầy đủ là gì? – outmind

1

Tại sao phải là const? Nếu bạn đang chỉ định cho nó, rõ ràng là nó có thể sửa đổi được. Đó sẽ là giới hạn giả tạo.

Đối với trường hợp sử dụng, tại sao không:

T &local = t1 = t2 = t3; 

Trong ví dụ này, local không phải là const.

+0

Loại t1, t2, t3 nào? T * hoặc T hoặc T &? – outmind

+1

Tại sao bạn có thể gán cho con trỏ? – kennytm

+0

@outmind: Trong trường hợp này, t3 là một kiểu có thể chuyển đổi và/hoặc gán cho t2, t2 là một kiểu có thể chuyển đổi và/hoặc gán cho t1, và t1 là một kiểu có thể chuyển đổi và/hoặc gán cho T *. – Bill

0

Nếu chúng ta xem xét ba auto_ptr a, b và c, toán tử = phải trả về tham chiếu không const để bạn có thể thực hiện nhiều phép gán kể từ khi gán con trỏ cho con trỏ khác.

vì vậy nếu chúng ta có a = b = c, điều sau xảy ra: c được gán cho b (c được sửa đổi thành không), toán tử trả về tham chiếu đến b tham chiếu được trả về bởi (b = c) được gán cho một, do đó nó được sửa đổi để trỏ tới null, điều này chỉ có thể nếu tham chiếu không phải là const.

8

Có thể vì đây là cách các loại ngôn ngữ bản địa hoạt động. ví dụ:

int x = 0, y = 1, z = 2; 
(x = y) = z; 

AFAIK, Dr. Stroustrup nói rằng điều tốt là phải nhất quán trong ngôn ngữ. tức là các loại do người dùng định nghĩa sẽ hoạt động giống như các kiểu gốc.

+0

Xin cảm ơn! Ví dụ tốt. C khả năng tương thích ngược và tính nhất quán. – outmind

+2

Ngoại trừ hành vi C++ khác với C. Từ chuẩn C99 (6.5.16/3 "Toán tử gán"): "Biểu thức gán có giá trị của toán hạng bên trái sau khi gán, nhưng không phải là một giá trị. " Sẽ rất thú vị khi biết suy nghĩ của Stroustrup là vì sao thay đổi này là cần thiết.Tôi không thể dễ dàng nghĩ ra một trường hợp sử dụng tốt, mong muốn (nhưng điều đó chỉ có nghĩa là ai đó cần nói với tôi hoặc nhắc tôi là gì). –

+0

Tính nhất quán với những gì? Trong ngôn ngữ C, kết quả của phép gán là một giá trị. C++ là * không * phù hợp với C trong vấn đề đó. – AnT

2

Andrew Koenig đã viết một post về điều này một thời gian dài trước đây. Rất nhiều người đến để làm những gì mọi người mong đợi trong những hoàn cảnh bất thường nhỏ. Ví dụ ông đưa ra là trong C, return x=y; luôn có nghĩa là cùng một điều như x=y; return x;.Trong C++, nếu bạn trả lại về cơ bản bất cứ điều gì khác so với tham chiếu (bao gồm tham chiếu const), hai có thể có nghĩa là những thứ khác nhau.

Chỉnh sửa: Xin lỗi, tôi đã liên kết với bài đăng không chính xác. Hãy thử this one. Vấn đề phát sinh từ thực tế là một T const & có thể liên kết với một tạm thời thay vì đối tượng "thực", vì vậy những gì đã xảy ra với mã ở trên là nó tạo ra một tạm thời, sao chép đối tượng vào nó, ràng buộc tham chiếu đến nó, phá hủy tạm thời, sau đó trả về tham chiếu (hiện đang lơ lửng).

+1

Làm cách nào? Làm thế nào họ có thể có nghĩa là những thứ khác nhau nếu bạn trả lại một cái gì đó khác hơn là tài liệu tham khảo? – AnT

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