Итак, я смотрел спецификацию std::vector и заметил, что reference typedef изменен с Allocator::reference на С++ 03 до value_type& на С++ 11. Я был удивлен, поэтому я начал смотреть глубже.
В С++ 03 §20.1.5 [lib.allocator.requirements] есть таблица 32, в которой X::reference определяется как T&, а X::const_reference определяется как T const&.
Однако в С++ 11 §17.6.3.5 [allocator.requirements] есть таблица 28, в которой отсутствуют reference и const_reference.
Далее мы добавили в С++ 11 §20.6.8 std::allocator_traits, который не включает reference. Но §20.6.9 std::allocator делает.
Наконец, существует §23.2.1 [container.requirements.general], которые определяют X::reference как "lvalue of T" и X::const_reference как "const lvalue of T".
Итак, я googled и нашел этот документ (1, 2) который предлагает удалить reference из требований распределителя, но в нем не упоминается никаких оснований. Но есть также проблема LWG, которая выступает против изменения.
Кроме того, я нашел интервью с Александром Степановым, в котором он рассказывает, как reference инкапсулирует макет памяти для конкретной машины и Herb Sutter post, в котором он говорит о приеме указателей на элементы контейнера, требования к контейнерам и как std::vector<bool> не является контейнером.
Итак, что вы думаете обо всем этом? Был ли полезен reference, он служил ему цели? Как "причудливые" ссылки соответствуют стандарту? Является ли это смелым шагом, чтобы полностью устранить их, сделать более строгие требования к контейнерам и отказаться от std::vector<bool>?