Могут ли несколько прокси-классов составлять STL-защищенный битовый вектор?

Этохорошо известный тотstd::vector не удовлетворяет стандартутребования к контейнеру, главным образом потому, что упакованное представление предотвращаетT* x = &v[i] от возврата указателя на бул.

Мой вопрос:это может быть исправлено / смягчено, когда reference_proxy перегружает адресoperator& вернуть указатель_прокси?

Указатель-прокси может содержать те же данные, что и reference_proxy в большинстве реализаций, а именно указатель на упакованные данные и маску для выделения конкретного бита внутри указанного блока. В результате перенаправления pointer_proxy получится reference_proxy. По сути оба прокси естьжир" указатели, которые, однако, все еще довольно легкие по сравнению с дисковыми прокси-контейнерами.

ВместоT* x = &v[0] тогда можно было бы сделатьauto x = &v[0]и использоватьx лайкif(*x) без проблем. Я также хотел бы иметь возможность написатьfor(auto b: v) { /* ... */ }

Вопросы: будет ли такой мульти-прокси подход работать с STL?алгоритмы? Или некоторые алгоритмы действительно полагаются на требованиеx должен быть реальнымbool*? Или требуется слишком много последовательных пользовательских преобразований, чтобы это не сработало? Я'Я хотел бы знать любое из таких препятствий, прежде чем пытаться полностью завершить приведенный выше эскиз реализации.

ОБНОВИТЬ (по материалам @HowardHinnant 'ответ и этодревняя дискуссия на comp.std.c ++)

Вы можете пройти долгий путь, почти имитируя встроенные типы: для любого заданного типа T пара прокси (например, reference_proxy и iterator_proxy) может быть взаимно согласованной в том смысле, что reference_proxy :: operator &() и iterator_proxy :: operator * () являются друг другомс обратным.

Однако в какой-то момент нужно сопоставить прокси-объекты обратно, чтобы они вели себя как T * или T &, Для прокси итераторов можно перегрузить оператор->() и получить доступ к шаблону T 'Интерфейс S без переопределения всей функциональности. Однако для ссылочных прокси вам потребуется перегрузить оператор. (), А это не разрешено в текущем C ++ (хотяСебастьян Редл представил такое предложение на BoostCon 2013). Вы можете сделать подробный обход, как член .get () внутри ссылочного прокси, или реализовать все T 's интерфейс внутри ссылки (это то, что делается для vector :: bit_reference), но это либо утратит встроенный синтаксис, либо введет пользовательские преобразования, которые не имеют встроенной семантики для преобразований типов (вы можете иметь не более одного пользовательского определенное преобразование для каждого аргумента).

Ответы на вопрос(2)

Ваш ответ на вопрос