2011-10-17 26 views
10

Đối với những gì tôi biết, C++ định nghĩa map<a,b>::value_type như pair<const a,b>value_type cho một bản đồ có con trỏ như là chìa khóa

Điều gì sẽ xảy ra nếu tôi sử dụng một loại con trỏ as type quan trọng trong bản đồ, tức là

std::map<const char*,int>::value_type::first_type = const char* 

như tôi mong đợi từ định nghĩa ở trên hoặc

std::map<const char*,int>::value_type::first_type = const char* const 

như sẽ hợp lý hơn (vì nếu không tôi sẽ được phép thay đổi giá trị khóa từ trình lặp bản đồ)?

+0

xem xét sử dụng std :: string thay thế. – nikhil

Trả lời

10

Lý do của bạn là chính xác, value_type::first sẽ là char const * const.

Có một nguồn gây nhầm lẫn phổ biến khi nghĩ rằng const T khi Ttype *const type *, nhưng điều đó không phải vậy. Không giống như macro, typedef s không phải là văn bản thay thế, cũng không phải là đối số mẫu. Khi bạn thực hiện const T, nếu T là một đối số typedef hoặc mẫu, bạn sẽ thêm const vào loại tổng thể.

Đó là lý do tại sao tôi muốn viết const s ở bên phải của loại, vì nó gây nhầm lẫn ít hơn: T const *, thêm một const bổ sung, nhận được T const * const.

+0

điều đó sẽ giảm bớt. Tôi đoán chúng ta nên khuếch tán, expecially trong số các lập trình viên mới, quy ước sử dụng 'loại const' thay vì' const type', điều này sẽ tránh nhầm lẫn trong trường hợp 'type' là một con trỏ. – pqnet

2

Nếu aconst char*, thì const a thực sự là const char* const.

0

Bạn là chính xác trong đánh giá của bạn, nhưng bạn phải rất cẩn thận với phương pháp này vì hai lý do:

  1. Bạn phải cung cấp một vị so sánh tùy chỉnh mà không trật tự chính xác của const char * (ví dụ, sử dụng biến thể strcmp chỉ trả về true nếu key1 < key2). Nếu bạn không làm điều này, các chuỗi của bạn sẽ được sắp xếp theo các giá trị con trỏ, hầu như không phải là những gì bạn muốn.
  2. Bạn phải xem xét tuổi thọ của các phím trong bản đồ của bạn và cách chúng sẽ được deallocated khi bản đồ bị phá hủy.
+0

có, thường thì đó sẽ là một lỗi phổ biến, tuy nhiên có những trường hợp bạn thực sự muốn so sánh con trỏ thay vì chuỗi (ví dụ: nếu bạn có chuỗi thời gian biên dịch không đổi là khóa, như phiên bản có thể in của enum, hoặc nếu bạn đang tạo một bản đồ từ HWND cho đối tượng xử lý cửa sổ tương đối trong quản lý sự kiện winapi) – pqnet

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