Итак, я смотрел спецификацию 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>
?