Cấu trúc sau thất bại trong việc biên dịch trong môi trường C++ 11 do thực tế là tôi đã tuyên bố các nhà điều hành phân công di chuyển như noexcept
:Tôi có thể bắt buộc một chức năng thành viên đặc biệt mặc định không được chấp nhận không?
struct foo
{
std::vector<int> data;
foo& operator=(foo&&) noexcept = default;
};
Toán tử gán di chuyển mặc định được tạo ra bởi trình biên dịch là noexcept(false)
do thực tế rằng nhiệm vụ di chuyển của std::vector<int>
cũng là noexcept(false)
. Điều này lần lượt là do thực tế là người cấp phát mặc định có std::allocator_traits<T>:: propagate_on_container_move_assignment
được đặt thành std::false_type
. Xem thêm this question.
Tôi tin rằng điều này đã được khắc phục trong C++ 14 (xem library defect 2103).
Câu hỏi của tôi là, có cách nào để tôi bắt buộc noexcept
khi toán tử gán nhiệm vụ chuyển mặc định mà không phải tự định nghĩa nó không?
Nếu điều này là không thể, có cách nào tôi có thể đánh lừa std::vector<int>
thành noexcept
chuyển nhượng được để noexcept(true)
được chuyển qua cấu trúc của tôi không?
Is it okay nếu 'dữ liệu' là một' std :: vector ' trong đó 'A' không phải là mặc định' std :: allocator '? –
aschepler
Tôi đang tìm cách giữ độ phức tạp của mã ở mức tối thiểu. Tôi hy vọng rằng việc sử dụng một trình phân bổ tùy chỉnh sẽ khó hơn cho các lập trình viên khác để hiểu hơn một toán tử gán di chuyển không mặc định đơn giản. – marack
Điều đó nói rằng, nếu 'A' trong' std :: vector 'là một trình bao bọc nội tuyến đơn giản cho trình phân bổ mặc định, nó có thể hoạt động ... –
marack