2012-07-02 5 views
4

В следующем коде:возвращение Его & от вектора

class SomeClass { 
    vector<int> i; 
    vector<bool> b; 

public: 
    int& geti() {return i[0];} 
    bool& getb() {return b[0];} 
}; 

Если закомментировать getb(), код компилируется нормально. По-видимому, нет проблем с возвратом ссылки на int, который хранится в векторе, но вы не можете сделать это с помощью bool.

Почему это?

+4

Принимая во внимание существующие ответы, вы все равно можете «спасти» свой код, используя «std :: vector :: reference» в качестве возвращаемого типа для своей функции вместо явного 'bool &'. 'std :: vector :: reference' будет тот прокси-класс, который действует как обобщенная ссылка для упакованного' std :: vector '. – AnT

ответ

11

std::vector<bool> «особенный». Он сохраняет свои элементы в виде битового массива, что означает, что элементы не адресуются индивидуально, и вы не можете получить ссылку на элемент.

std::vector<bool> итераторы, его operator[] и другие его функции-члены возвращают прокси-объекты, которые обеспечивают доступ к элементам, не требуя реальных bool объектов для хранения.

Если вам нужно, чтобы иметь возможность доступа к отдельным элементам, рассмотреть возможность использования std::vector<char> или определения bool -кака перечисления подкрепленного char (или signed char или unsigned char, если вы заботитесь о знаковости).

+0

+1 Хороший улов ... Это даже не перешло мне в голову. Я провел минуту. думая о ссылках на местные жители и прочее ... – Mysticial

+0

Это невероятно раздражает. Спасибо за ответ. – anthropomorphic

+0

IIRC 'std :: vector ' устарел и не должен использоваться. –

2

< вектор BOOL> это специальный шаблон класса специализации для BOOL типа.

Эта специализация предоставляется для оптимизации пространственного размещения: восемь Элементы bool объединены в один байт, и каждый элемент bool занимает только один бит.

Ссылка на один бит в определенном байте не допускается.

Так что функция не может возвращать ссылку на BOOL типа а в векторе < BOOL>.

Кто-то также считает, что вектор < bool> не является контейнером.

Вы можете использовать deque < bool> вместо этого.

Смежные вопросы