Когда я перебираю vector<bool>
, я обнаружил, что элементы, разыменованные через итератор, распознаются, как если бы они были const. Почему это? Измените либо контейнер, либо тип элемента, например list<bool>
, или vector<short>
, а элементы не являются константами. Этот код показывает, что я говорю о:Почему неконстантный вектор <bool> элементов const?
typedef bool T;
#define C vector
istringstream &operator>>(istringstream &iss, T &v)
{
cout << "non-const" << endl;
return iss;
}
istringstream &operator>>(istringstream &iss, const T &v)
{
cout << "const" << endl;
return iss;
}
istringstream &operator>>(istringstream &iss, C<T> &c)
{
for (C<T>::iterator it = c.begin(); it != c.end(); ++it)
{
iss >> *it;
}
return iss;
}
int main()
{
C<T> c(1);
istringstream iss("1");
iss >> c;
}
Для vector<bool>
, программа печатает «сопзЬ» в консоли. Измените typedef и константу манифеста в верхней части на что-либо, кроме этих двух комбинаций, и печатает «неконстантные». Кроме того, если я заменю строку, iss >> *it
, с T v; iss >> v; *it = v;
, она работает как ожидалось - все комбинации печатают «неконстантные».
Я вижу то же поведение с GCC 4.1.2 C++ 98 (через codepad.org) и VS2015 C++ 14 + (?).
Короткий ответ: 'std :: vector' специальный. Вы можете найти ссылку на нее, чтобы увидеть, что отличает. –
chris
Да, я только что заметил это. Я пишу несколько модных шаблонов, и я бы предпочел не специализироваться на bool. – plong
Прочтите некоторые интересные факты о 'vector' здесь: https://isocpp.org/blog/2012/11/on-vectorbool –
Steephen