2015-03-25 18 views
18

Tôi vừa mới được lọ của thành viên này:Tại sao bản đồ <string, string> chấp nhận ints làm giá trị?

#include <map> 
#include <string> 
#include <iostream> 

using namespace std; 

int main() { 
    map<string, string> strings; 
    strings["key"] = 88; // surprisingly compiles 
    //map<string, string>::mapped_type s = 88; // doesn't compile as expected 

    cout << "Value under 'key': '" << strings["key"] << "'" << endl; 

    return 0; 
} 

It in 'X' là 88 trong ASCII.

Tại sao bản đồ chuỗi chấp nhận int làm giá trị? Tài liệu cho bản đồ là operator[] cho biết nó trả về mapped_type&string& trong trường hợp này và nó không có chuyển đổi ngầm từ int, phải không?

+9

Liên quan: [Tại sao C++ cho phép một số nguyên được gán cho một chuỗi?] (Http://stackoverflow.com/q/1177704/335858). – dasblinkenlight

Trả lời

20

Điều này là do, như bạn nói, operator[] trả về một std::string&, xác định một operator= (char c). Ví dụ nhận xét của bạn không gọi toán tử gán, nó là copy-initialization, sẽ cố gắng gọi các nhà xây dựng rõ ràng của lớp, trong đó không có nhà thầu áp dụng nào trong số std::string.

3

Để hoàn thành bức tranh, lưu ý rằng:

strings[88] = "key"; 

không biên dịch như không có std::string constructor từ char/int. Đối với char, std::string chỉ xác định toán tử gán.

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