Thứ nhất, tôi biết là this question, nhưng tôi không tin rằng tôi đang yêu cầu điều tương tự.Tại sao push_back không thể bị quá tải để thực hiện công việc của emplace_back?
Tôi biết những gì std::vector<T>::emplace_back
không - và tôi hiểu tại sao tôi sẽ sử dụng nó trên push_back()
. Nó sử dụng các mẫu variadic cho phép tôi chuyển tiếp nhiều đối số tới hàm tạo của một phần tử mới.
Nhưng điều tôi không hiểu là tại sao ủy ban tiêu chuẩn C++ quyết định có nhu cầu cho một chức năng thành viên mới. Tại sao họ không thể mở rộng chức năng của push_back()
. Theo như tôi thấy, push_back
có thể bị quá tải trong C++ 11 là:
template <class... Args>
void push_back(Args&&... args);
này sẽ không phá vỡ tính tương thích ngược, đồng thời cho phép bạn để vượt qua đối số N, bao gồm lập luận rằng sẽ gọi một rvalue bình thường hoặc copy constructor. Trong thực tế, GCC C++ 11 thực hiện push_back()
chỉ đơn giản gọi emplace_back anyway:
void push_back(value_type&& __x)
{
emplace_back(std::move(__x));
}
Vì vậy, cách tôi nhìn thấy nó, không có nhu cầu cho emplace_back()
. Tất cả những gì họ cần thêm là quá tải cho push_back()
chấp nhận đối số variadic và chuyển tiếp các đối số tới hàm tạo phần tử.
Tôi có sai ở đây không? Có lý do nào đó cần một chức năng hoàn toàn mới ở đây không?
trông giống như sau: http://stackoverflow.com/questions/4303513/push-back-vs-emplace-back – moka
Câu hỏi hay. @moka anh ấy biết sự khác biệt giữa những gì hai chức năng làm. Anh thậm chí còn liên kết với câu hỏi cụ thể đó. –
Họ có ý nghĩa khác nhau, tất cả đều được giải thích trong câu hỏi bạn đã đề cập bạn đọc. So sánh 'v.emplace_back (123)' và 'v.push_back (123)' ví dụ cho 'vector v;' với chuyển đổi ngầm từ 'int'. –