2014-12-05 2 views
2

Я только что испытал этот кусок кода.переменная, объявленная auto иногда по ссылке?

vector<bool> v(5, true); 
if(v.back())cout<<"====="<<endl; 
auto b1 = v.back(); 
b1 = false; 
cout<<&b1<<endl; 
if(v.back())cout<<"*********"<<endl; 

Мои вопросы следующие:

  1. "*********" (без кавычек) не появляется на выходе, почему переменная объявленного auto меняется bool vector v?
  2. Я понимаю, что vector<bool> не является стандартным контейнером STL, и обращаясь к элементу него &v[4] не будет работать (так как вы не можете обратиться к адресу немного), если b1 объявлен ссылкой на v.back(), почему Я могу обратиться к b1 по телефону &b1?
  3. В каких случаях auto имеет такое поведение? Делает auto c1 = v.begin() и позже делает c1 = (++v.begin()) изменит v.begin()?
+3

Знайте, что 'vector ' не является «вектором». – Deduplicator

+2

'back()' return reference, поэтому я думаю, что авто будет предпочитать объявлять его ссылкой. если вы хотите быть уверенным проверить его с классом и проверить, был ли вызван конструктор копирования. – SHR

+3

@ ШХР: Э-э ... что? 'auto x = whatever;' всегда означает, что 'x' * не является * ссылкой. – Deduplicator

ответ

11

vector<bool> сбой в стандартной библиотеке, которая vector<T>не контейнер T с.

Таким образом, он имеет существенно отличающееся поведение от всех других экземпляров vector.

Конкретная бородавка вы споткнулись, что это элемент типа reference класс прокси, представляющий ссылку на один bool.

Это означает, что auto, который никогда выводящие в качестве эталона, выведенные в этом прокси-классе, будет вести себя , как будто это была ссылка.

&v[4] не будет работать для получения указателя на bool с индексом 4, потому что vector<bool> не контейнер bool и индекс-оператор также возвращает эти прокси-классы.

Естественно, vector<bool> имеет действительно специальные итераторы, которые позволяют выполнять итерацию по бит-множеству, поэтому использование итераторов имеет только гандикап, который разыменовывает итератор, также возвращает прокси-сервер.

+0

Что вы подразумеваете под «a» vector ', который не является контейнером' T 's"? Вы имеете в виду только 'vector ' здесь? – Allanqunzi

+0

@ user2345484: Да. Я думал, что это недвусмысленно. – Deduplicator

+0

спасибо, я думаю, что понял. – Allanqunzi

Смежные вопросы