2010-03-27 39 views
8
std::string x(x); 

Sự cố này rất tệ trên trình biên dịch của tôi. Điều này có nghĩa là tôi nên thử nghiệm cho this != &that trong các nhà xây dựng bản sao của riêng tôi, hoặc tôi có thể giả định rằng không có khách hàng nào sẽ quá ngu ngốc?std :: string x (x);

+0

Bạn có nghĩa là chương trình kết quả bị lỗi hoặc trình biên dịch tự treo? –

+0

Trong một trình tạo bản sao không cần thiết, nhưng bạn nên kiểm tra điều đó trong một toán tử gán. –

+1

Chương trình kết quả bị treo khi chạy. – fredoverflow

Trả lời

6

Khởi tạo thứ gì đó với chính nó là hành vi không xác định, điều này thậm chí có thể có nghĩa là khi nó được gọi, bạn thậm chí không thể phát hiện nó sau này. Giả sử trình biên dịch phát hiện ra nó và mặc dù tạo ra lắp ráp cho các mũi quỷ, không phải là một cuộc gọi đến nhà xây dựng sao chép của bạn cả?

Trong thực tế, bạn có thể giả định rằng khách hàng không phải là ngu ngốc, và nếu họ là doanh nghiệp của họ để gỡ lỗi và tìm ra.

+1

Trường hợp tiêu chuẩn chính xác nói rằng đây là hành vi không xác định? – fredoverflow

+1

Thành thật mà nói, tôi ngạc nhiên vì nó thậm chí còn biên dịch. Vấn đề là, constructor sao chép 'std :: string' sẽ cố gắng gọi phương thức/truy cập dữ liệu trong' x', nhưng 'x' vẫn chưa được xây dựng. Do đó, hành vi không xác định bởi vì nó sẽ cố gắng làm những việc với một biến chưa được xây dựng. –

+0

@FredOverflow: Tôi nghĩ một phần của tiêu chuẩn có liên quan là "điểm tuyên bố" (3.3.1). Cũng có thể rằng điều này có một số sử dụng có ý nghĩa, ví dụ như lớp lưu trữ một tham chiếu đến một thể hiện khác của lớp (hoặc chính nó), sau đó chúng ta có thể làm ví dụ: 'X x (" self ", x); X y ("khác", x); 'v.v. Trong trường hợp này, tôi giả sử các quy tắc sẽ tương tự như sử dụng ** this ** trong danh sách khởi tạo lớp. – UncleBens

9

Bạn không nên kiểm tra mã cố gắng gây lỗi nghiêm trọng. Xem Null References. Nó nói

"Cũng giống như bạn phải giả định rằng một con trỏ không null là hợp lệ, bạn phải cho rằng tham chiếu là hợp lệ. Bạn phải có niềm tin vào các lập trình viên đồng nghiệp của mình".

Tôi muốn bổ sung cho

... bạn phải giả định rằng nguồn gốc của một bản sao có giá trị.

Nếu bạn "khắc phục" trường hợp của bạn, phải làm gì cho trường hợp này?

string x = string(x); 
2

Mã đó không đúng theo tiêu chuẩn và không có ý nghĩa để kiểm tra và điều tốt nhất có thể xảy ra là lỗi nhanh để người dùng có thể sửa mã của họ.

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