Hãy nhìn vào đoạn mã sau:std :: map <> :: chèn sử dụng đối tượng không copyable và thống nhất khởi
#include <utility>
#include <map>
// non-copyable but movable
struct non_copyable {
non_copyable() = default;
non_copyable(non_copyable&&) = default;
non_copyable& operator=(non_copyable&&) = default;
// you shall not copy
non_copyable(const non_copyable&) = delete;
non_copyable& operator=(const non_copyable&) = delete;
};
int main() {
std::map<int, non_copyable> map;
//map.insert({ 1, non_copyable() }); < FAILS
map.insert(std::make_pair(1, non_copyable()));
//^same and works
}
Biên dịch đoạn này không thành công khi uncommenting dòng rõ rệt trên g ++ 4.7. Lỗi được tạo ra cho biết rằng không thể sao chép non_copyable
nhưng tôi đã dự kiến nó sẽ được di chuyển.
Tại sao chèn std::pair
được xây dựng bằng cách khởi tạo đồng bộ không thành công nhưng không được xây dựng bằng cách sử dụng std::make_pair
? Cả hai đều không phải sản xuất các giá trị có thể được chuyển thành công vào bản đồ?
Vâng, đó là những gì tôi đã viết trước khi xóa câu trả lời của mình. Tôi có một nghi ngờ mặc dù: tại sao là một 'initializer_list <>' tạo ra ở đây? 'std :: pair' dường như không có một hàm tạo. Tôi nghĩ cú pháp khởi tạo đồng bộ sẽ chỉ chọn hàm tạo thông thường của 'cặp <>'. –
Ngoài ra, các yếu tố initializer_list <> phải là tất cả cùng loại, phải không? – eladidan
+1 cho cả hai nhận xét. Thậm chí không nên có một 'initializer_list' trong ví dụ của tôi. Nó giống như một cuộc gọi đến constructor 'std :: pair' bằng cách khởi tạo đồng bộ. – mfontanini