Задать вопрос
@Drottarutarnum
Любопытный любитель

Почему нельзя перегрузить оператор?

Не могу перегрузить оператор, если тип возвращаемого значения bool
Если я создаю вектор из int, то все нормально

Ошибка:
начальное значение ссылки на неконстантный параметр должно быть левосторонним значением


class Test {
private:
	vector<bool> selfVector;
public:
	Test(vector<bool> &_vector):selfVector(_vector) {}

	bool& operator [] (int index) {
		return selfVector[index];
	}
};

vector<bool> myVector = {true, true };
auto test = Test(myVector);
test[0] = false;
  • Вопрос задан
  • 430 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
bool& operator [] (int index) {
    return selfVector[index];
  }

должен стать
std::vector<bool>::reference operator [] (int index) {
    return selfVector[index];
  }
Ответ написан
Комментировать
SerJook
@SerJook
кодер
В целях оптимизации памяти стандарт языка C++ называет vector<bool> специальным стандартным контейнером, в котором каждый элемент bool использует только один бит памяти вместо того, чтобы занимать 1 байт, как занимает обычный bool. Ценой этой оптимизации является то, что этот контейнер не предоставляет всех возможностей и интерфейс, как это делает нормальный стандартный контейнер.

Т.к. мы не можем получить адрес отдельного бита в байте, такие вещи, как operator[] не могут вернуть bool&, а вместо этого возвращают прокси-объект, который позволяет манипулировать отдельным битом. Этот прокси не является типом bool&, вы не можете присвоить его адрес указателю с типом bool*, как вы могли бы сделать с "нормальным" контейнером. Это означает что bool &pb =v[0] не является валидным кодом.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы