Mã này không thành công, vì tự động & là tham chiếu const. [nhấn mạnh mỏ]
Lý do của bạn không giữ. Trong vòng lặp dựa trên phạm vi, những gì bạn khai báo (ở đây, auto& ab
) là không phải được liên kết với biểu thức phạm vi (tại đây, {a,b }
). Thay vào đó, ab
sẽ được khởi tạo từ các yếu tố của phạm vi, không phải phạm vi của chính nó.
Thay vào đó, lỗi xuất phát từ việc gọi std::sort
với thông số ab.begin()
/ab.end()
, có thể dễ dàng được chứng kiến bằng cách nhận xét nội dung vòng lặp. Như RMartinho đã chỉ ra, các thành phần của std::initializer_list<std::vector<double>>
là không thay đổi và bạn không thể sắp xếp vùng chứa const
(std::sort
các yếu tố bằng cách sử dụng di chuyển, không thể gán cho phần tử const
).
Giả sử bạn muốn (độc lập) sắp xếp cả hai vectơ, bạn có thể làm:
for(auto& ab: { std::ref(a), std::ref(b) })
std::sort(std::begin(ab.get()), std::end(ab.get()));
ý rằng theo nguyên tắc khấu trừ mẫu đối số, auto&
là tốt ở đây và auto
sẽ được rút ra để const std::reference_wrapper<std::vector<double>>
, năng suất std::reference_wrapper<std::vector<double>> const&
như loại ab
.
Nguồn
2012-02-07 12:16:08
là gì '{a, b} '? –
@ Độ sáng là một 'std :: initializer_list>'. vấn đề ở đây là các trình lặp của một danh sách khởi tạo là * luôn luôn * 'const'. –
Vì vậy, có bạn đi. Tôi tự hỏi liệu một số phép thuật chuyển tiếp rvalue có thể giúp đỡ ở đây không. –