2012-06-15 60 views
18

Chúng tôi biết rằng nếu chúng ta cố gắng truy cập khóa không tồn tại của std::map với toán tử [], hàm sẽ chèn phần tử mới bằng khóa đó.toán tử bản đồ [] và bool là giá trị

Chúng tôi có: std::map<std::string, bool> map_xxx;

Có đảm bảo rằng sau khi truy cập vào các khóa không tồn tại của map_xxx["nonexistent_key"], giá trị của đối số thứ hai sẽ luôn luôn được false?

ps. nếu không, bất kỳ ý tưởng nào để có hành vi này?

+0

Tôi nghĩ câu hỏi của bạn thực sự là: "Giá trị của' bool() 'là gì?", Hiển nhiên từ mã được hiển thị trên [trang này] (http://en.cppreference.com/w/ cpp/container/map/operator_at). – chris

+0

có thể trùng lặp của [Có phải hàm tạo mặc định của std :: pair <> thiết lập các kiểu cơ bản (int, v.v.) thành số không?] (Http://stackoverflow.com/questions/9025792/does-the-default-constructor-of -stdpair-set-basic-types-int-etc-to-zero) – ildjarn

Trả lời

26

Có. Giá trị được chèn được đảm bảo là false.


Trong C++ 98, cơ chế được gọi là khởi tạo mặc định, được chỉ định là khởi tạo không cho lớp không; đó là false cho Booleans.

Vì C++ 03, cơ chế được gọi là khởi tạo giá trị, vẫn được chỉ định là khởi tạo không cho các lớp không phải là lớp; và do đó vẫn còn false cho Booleans. Ví dụ, chúng ta hãy xem những gì C++ 14 đã nói về điều này.

Từ §23.4.4.3; chỉ cần thay thế bool cho "T".

T & operator [] (const key_type & x);

  1. Effects: Nếu không có tương đương chìa khóa để x trong bản đồ, chèn value_type (x, T()) vào bản đồ.
  2. Yêu cầu: key_type phải là CopyInsertable và mapped_type sẽ là DefaultInsertable thành * điều này.

Từ §8.5, tiêu hóa các đoạn từ dưới lên:

Để zero-khởi tạo một đối tượng hoặc tài liệu tham khảo của loại T có nghĩa là:

- nếu T là một kiểu vô hướng (3.9), đối tượng được khởi tạo với giá trị thu được bằng cách chuyển đổi số nguyên theo số (0) đến T;

...

Để giá trị khởi tạo một đối tượng kiểu T có nghĩa là:

- nếu T là một (có thể cv-đủ điều kiện) kiểu lớp (khoản 9) với một trong hai không có constructor mặc định (12.1) hoặc một hàm tạo mặc định do người dùng cung cấp hoặc xóa, khi đó đối tượng được khởi tạo mặc định;

- nếu T là loại lớp (có thể cv đủ điều kiện) không có trình tạo mặc định do người dùng cung cấp hoặc đã xóa, thì đối tượng là zero-initialized và ràng buộc ngữ nghĩa để khởi tạo mặc định được chọn, và nếu T có non-trivial default constructor, đối tượng được khởi tạo mặc định;

- nếu T là một loại mảng thì mỗi phần tử được khởi tạo giá trị;

- nếu không, đối tượng là zero-initialized.

...

Một đối tượng có initializer là một tập rỗng của dấu ngoặc đơn, ví dụ: (), phải giá trị khởi tạo.

Từ §4.12:

Một prvalue của số học, liệt kê unscoped, con trỏ, hoặc con trỏ đến loại thành viên có thể được chuyển đổi sang một prvalue kiểu bool. A giá trị bằng không, giá trị con trỏ null hoặc giá trị con trỏ thành viên null được chuyển thành false; bất kỳ giá trị nào khác được chuyển thành true. Đối với khởi tạo trực tiếp (8.5), một giá trị của loại std :: nullptr_t có thể được chuyển đổi thành giá trị của bool kiểu bool; giá trị kết quả là sai.

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