2013-05-17 25 views
5

Tôi đang đọc qua "Thư viện chuẩn C++ của Nicolai M. Josuttis" và đã đạt đến phần trên std::pair. Tác giả lưu ý rằng:Tại sao tiêu chuẩn lớp std :: pair thay đổi để không cho phép các loại chỉ với một hàm tạo bản sao không cố định trong C++ 11?

Vì C++ 11, pair<> sử dụng loại chỉ có một trình tạo bản sao không liên tục sẽ không còn biên dịch.

Sau đó, ông tiếp tục cung cấp cho các ví dụ sau:

class A 
{ 
    public: 
    ... 
    A(A&); // copy constructor with nonconstant reference 
    ... 
}; 

std::pair<A, int> p; // Error since C++11 

Tuy nhiên, tôi quan tâm đến lý do rằng ủy ban tiêu chuẩn quyết định làm việc sửa đổi này theo tiêu chuẩn thư viện tiêu chuẩn? Tôi đã cố gắng để google lý do, nhưng đã không thành công trong việc tìm kiếm bất cứ điều gì thích hợp.

+1

Tôi sẽ phải đoán rằng luôn luôn có nghĩa là sử dụng const để hứa với người dùng để bảo toàn nội dung của cặp và C++ 11 có thể phù hợp với tiêu chuẩn thực tế. –

Trả lời

4

Trong C++ 98, sao chép các hàm tạo với tham số tham chiếu không liên tục sẽ là (ab)used to "move" elements xung quanh. Mã như vậy nổi tiếng là không an toàn và không rõ ràng. Các khét tiếng và bây giờ deprecated std::auto_ptr là ví dụ chính của điều đó.

Trong C++ 11, chúng tôi có tài liệu tham khảo move semantics và rvalue để đạt được cùng một hiệu ứng an toàn hơn và rõ ràng hơn. Điều này là do tham chiếu rvalue là tham chiếu đến một đối tượng có thể thay đổi, nhưng nó chỉ có thể liên kết với các biểu thức "an toàn" như thời gian hoặc những thứ bạn đã truyền rõ ràng (qua std::move) và do đó được đánh dấu là dùng một lần.

Tóm lại: các lớp với các nhà xây dựng sao chép tham gia các thành viên không tham chiếu không có trường hợp sử dụng thực tế mà không thể thực hiện tốt hơn và an toàn hơn với tham chiếu rvalue. std::pair đã mua một công cụ xây dựng di chuyển std::pair(std::pair&&)=default để chứa các ngữ nghĩa như vậy.

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