vector & lt; bool & gt; :: operator [] misbehavior?

Возможный дубликат:
Почему вектор<BOOL>:: ссылка не возвращает ссылку на bool?

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

#include <iostream>
#include <vector>
using namespace std;

template <typename T>
void Test(const T& oldValue, const T& newValue, const char* message)
{
cout << message << '\n';

vector<T> v;
v.push_back(oldValue);
cout << " before:  v[0] = " << v[0] << '\n';

// Should be a deep-copy (?)
auto x = v[0];
x = newValue;

cout << " after:   v[0] = " << v[0] << '\n';
cout << "-------------------------------\n";
}

int main()
{
Test<int>(10, 20, "Testing vector<int>");
Test<double>(3.14, 6.28, "Testing vector<double>");
Test<bool>(true, false, "Testing vector<bool>");
}

Вывод (исходный код скомпилирован с VC10 / VS2010 SP1):

Testing vector<int>
before:  v[0] = 10
after:   v[0] = 10
-------------------------------
Testing vector<double>
before:  v[0] = 3.14
after:   v[0] = 3.14
-------------------------------
Testing vector<bool>
before:  v[0] = 1
after:   v[0] = 0
-------------------------------

Я бы ожидал что v[0] после x = newValue присваивание все равно будет равно его предыдущему значению, но это не так.
Это почему?
Почему vector<bool> специальный?

7

Решение

vector<bool>::operator[] ни один не дает bool ни ссылка на bool, Просто немного возвращается объект прокси это действует как ссылка. Это потому, что нет ссылок на отдельные биты и vector<bool> на самом деле хранит boolс сжатым способом. Итак, используя auto Вы только что создали копию этого ссылочного объекта. Проблема в том, что C ++ не знает, что этот объект действует как ссылка. Вы должны заставить «затухание до значения» здесь, заменив auto с T,

6

Другие решения

vector<bool> отвратительная и особенная мерзость Комитет специализировал его для упаковки битов, поэтому он не поддерживает надлежащую эталонную семантику, поскольку вы не можете ссылаться на бит, это означает, что он имеет несоответствующий интерфейс и фактически не считается стандартным контейнером. Решение, которое использует большинство людей, состоит в том, чтобы никогда, никогда, никогда не использовать vector<bool>,

20

operator[] возвращает T& для каждого значения T кроме boolгде это дает ссылку на прокси. Видеть это старая колонна Херб Саттер о том, почему с помощью vector<bool> в общем коде это плохая идея (и почему это даже не контейнер). Есть также специальный пункт об этом в Effective STL Скотта Мейерса, и тонны вопросы на это здесь, на SO.

4
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector