2017-10-03 28 views
14

Nếu tôi có vector<bool> vec_bool thì tôi không thể sửa đổi nội dung của véc tơ bằng cách sử dụng toán tử gán |=. Đó là, các dòngTại sao toán tử gán phân chia | = không hoạt động với vectơ của bool?

vec_bool[0] |= true; 
vec_bool[0] |= vec_bool[1]; 

lỗi Hãy cho trình biên dịch, trong khi các dòng

bool a = false; 
a |= true; 
a |= vec_bool[0]; 
vec_bool[0] = vec_bool[0] | vec_bool[1]; 
vec_bool[0] = vec_bool[0] || vec_bool[1]; 

vector<int> vec_int(3); 
vec_int[0] |= vec_int[1]; 

thì không. Lý do cho điều này là gì?

Các lỗi nhất định (bằng gcc) là:

test.cpp:21:17: error: no match for ‘operator|=’ (operand types are ‘std::vector::reference {aka std::_Bit_reference}’ and ‘bool’)

+14

Bạn phải nhớ rằng ['std :: vector '] (http://en.cppreference.com/w/cpp/container/vector_bool) không phải là một véc tơ * thông thường *. Nó không phải là một vectơ thực tế của 'bool', nhưng giống như một vectơ các bit, mà việc thực hiện của nó không được chỉ rõ bởi đặc tả C++. –

+2

Bản sao có thể có của [Tại sao std :: vector không có .data()?] (Https://stackoverflow.com/questions/46115669/why-does-stdvectorbool-has-no-data) –

+2

Bạn có thể thực hiện xem http://en.cppreference.com/w/cpp/container/vector_bool để biết thêm thông tin về nó – cbuchart

Trả lời

18

Các reference trở về từ operator[] của std::vector<bool> không phải là một bí danh cho bool&, vì nó là dành cho chuyên môn chính của std::vector. Nó khá được xác định bởi các C++ standard as this:

// bit reference: 
class reference { 
    friend class vector; 
    reference() noexcept; 
public: 
    ~reference(); 
    operator bool() const noexcept; 
    reference& operator=(const bool x) noexcept; 
    reference& operator=(const reference& x) noexcept; 
    void flip() noexcept;  // flips the bit 
}; 

Và như bạn có thể thấy, không có operator |= tuyên bố. Vì vậy, bạn không thể áp dụng nó trên tài liệu tham khảo trở về từ vec_bool[0].

Lý do mà vec_bool[0] = vec_bool[0] | vec_bool[1]; hoạt động là ở đó có là quá tải ở trên tạo điều kiện thuận lợi cho nó. operator bool() chuyển đổi hai toán hạng của giá trị | được tích hợp thành bool giá trị. Và sau đó toán tử gán của reference gán kết quả trở lại vec_bool[0].

Theo quy định của tiêu chuẩn C++, std::vector<bool> không phải là một trừu tượng đặc biệt tốt, IMO.

+0

Cảm ơn bạn! Có lẽ bạn có thể cho tôi biết nếu 'vector ' là loại vector duy nhất lệch khỏi việc thực hiện 'chuẩn' của loại vectơ? –

+6

@MeesdeVries - Đây là tiêu chuẩn duy nhất mà tiêu chuẩn C++ bắt buộc phải đi chệch khỏi khai báo chính. Tất cả những người khác bạn có thể giả định là mẫu chính. – StoryTeller

+3

... có nghĩa là, những người khác có thể chuyên về lý do hiệu suất, nhưng bạn không thể phát hiện ra rằng trong mã di động. – MSalters

Các vấn đề liên quan