Tiêu chuẩn không yêu cầu điều này để biên dịch trên bất kỳ chuỗi công cụ nào !
Đầu tiên nhớ lại đó vector<bool>
là lạ và đăng ký nó cung cấp cho bạn một đối tượng tạm thời của một loại proxy được gọi std::vector<bool>::reference
, chứ không phải là một thực tế bool&
.
Thông báo lỗi cho bạn biết rằng nó không thể liên kết tạm thời với const
tham chiếu không có giá trị trong template <typename T> std::swap(T& lhs, T& rhs)
triển khai chung .
Phần mở rộng!
Tuy nhiên, hóa ra libstdc ++ định nghĩa quá tải cho std::swap(std::vector<bool>::reference, std::vector<bool>::reference)
, nhưng đây là một phần mở rộng cho tiêu chuẩn (hoặc, nếu nó ở trong đó, tôi không thể tìm thấy bất kỳ bằng chứng nào cho nó).
libc ++ thực hiện điều này quá .
Tôi đoán rằng việc triển khai stdlib của Visual Studio, mà bạn vẫn đang sử dụng, không , nhưng sau đó để thêm sự xúc phạm đến thương tích, bạn có thể liên kết tạm thời với các tham chiếu giá trị trong VS (trừ khi bạn đang sử dụng chế độ tuân thủ), vì vậy std::swap
Hàm "chung" tiêu chuẩn hoạt động cho đến khi bạn thay thế trình biên dịch VS cho trình biên dịch Clang chặt chẽ hơn.
Do đó, bạn đã dựa vào các tiện ích mở rộng trên cả ba công cụ mà nó hoạt động cho bạn và kết hợp Clang trên Windows là công cụ duy nhất thực sự thể hiện sự tuân thủ nghiêm ngặt.
(Theo tôi, ba bộ công cụ đó đã chẩn đoán điều này nên bạn đã không gửi mã không di động trong suốt thời gian này. 😊)
Gì bây giờ?
Có thể bạn muốn thêm chuyên môn của riêng mình std::swap
và std::vector<bool>::reference
, nhưng bạn không được phép làm điều này cho các loại tiêu chuẩn; thật vậy, nó sẽ mâu thuẫn với sự quá tải mà libstdc ++ và libc ++ đã chọn để thêm làm tiện ích mở rộng.
Vì vậy, để có thể di động và tuân thủ, bạn nên thay đổi mã của mình .
Có lẽ là một lỗi thời:
const bool temp = vb[0];
vb[0] = vb[1];
vb[1] = temp;
Hoặc sử dụng hàm thành viên tĩnh đặc biệt thực hiện chính xác những gì bạn muốn :
std::vector<bool>::swap(vb[0], vb[1]);
Cũng có thể đánh vần như sau:
vb.swap(vb[0], vb[1]);
operator[]
một giá trị? và có thểstd::swap
hoạt động trên giá trị và xvalues?