2010-05-29 48 views
8

Sau đây:đồ STL chứa tài liệu tham khảo không biên dịch

std::map<int, ClassA &> test; 

cho:

error C2101: '&' on constant 

Trong khi sau

std::map<ClassA &, int> test; 

cho

error C2528: '_First' : pointer to reference is illegal 

Sau này có vẻ như bản đồ không thể chứa một tham chiếu cho giá trị khóa, vì nó cần phải khởi tạo lớp đôi khi và một tham chiếu không thể được khởi tạo mà không có một đối tượng. Nhưng tại sao trường hợp đầu tiên không hoạt động?

Trả lời

16

Việc lưu trữ tài liệu tham khảo trong vùng chứa stl là bất hợp pháp, vì các loại phải được sao chép có thể định cấu hình và có thể gán được. Không thể chỉ định tham chiếu.

Chính xác thao tác nào gây ra lỗi đầu tiên phụ thuộc vào việc triển khai thực hiện, nhưng tôi cho rằng nó có liên quan đến việc tạo tham chiếu và không gán nó ngay lập tức. Thông báo lỗi thứ hai có vẻ như thực sự liên quan đến việc xây dựng chỉ mục bản đồ.

Nếu loại của bạn nhỏ, bạn có thể sao chép nó vào bản đồ, hoặc nếu nó lớn xem xét sử dụng con trỏ thay vào đó, nhưng hãy nhớ rằng các container sẽ không deallocate các đối tượng cho bạn, bạn sẽ phải làm điều đó một cách rõ ràng cho mình .

This SO câu hỏi có thể bạn quan tâm.

3

§8.3.2 phần 5

Sẽ không có tham chiếu đến tài liệu tham khảo, không có mảng tài liệu tham khảo, và không có con trỏ để tham khảo.

Có thể bạn đang nghĩ đến các tham chiếu làm con trỏ hài hước. Họ không phải.

1

Bạn không thể lưu trữ tài liệu tham khảo vì chúng không phải là bản sao có thể xây dựng được (và một số thao tác sẽ không thể vì chúng không được cấu hình mặc định).

Bạn tuy nhiên có thể bắt chước hành vi sử dụng một con trỏ:

std::map<int, ClassA*> test; 

Đó là một chút khó chịu vì sau đó bạn cần phải dereference hai lần:

std::map<int, ClassA*>::iterator it = test.begin(); 

it->second->foo(); 

nhưng với một map nó nhiều ít gây nhầm lẫn hơn với a vector hoặc set (nó sẽ là (*it)->foo().

Cuối cùng, có một số gotchas (những người của một con trỏ):

  • Bạn phải đảm bảo hơn so với đối tượng được trỏ tới sẽ vẫn còn sống chừng nào bạn muốn sử dụng con trỏ
  • Việc khởi mặc định của một con trỏ là một giá trị ngẫu nhiên, sử dụng nó gây ra hành vi undefined
  • Khi con trỏ được vứt bỏ, những gì còn lại đối tượng (may mắn), nhưng nó không có nghĩa là bạn cần phải thực hiện nó sẽ bị phá hủy tại một thời điểm
Các vấn đề liên quan