В контексте приведенного ниже кода, почему cout ‹‹ c является допустимым, а c = x недопустимым?

Я новичок в С++ и пытаюсь изучить концепцию ключевого слова "авто" и ссылки. Я видел этот вопрос и ответ в Интернете.

Является ли следующий диапазон законным? Если да, то какой тип c?

const string s = "Keep out!";
for (auto &c : s){ /*... */ }

И ответ таков:

В зависимости от кода внутри тела цикла for. Например:

cout << c;  // legal.
c = 'X';    // illegal.

Никаких объяснений предоставлено не было. Может ли кто-нибудь объяснить, почему это так?


person Thor    schedule 02.02.2016    source источник
comment
Тип c вообще не зависит от тела цикла. В целом система типов C++ работает иначе, за одним известным мне исключением.   -  person chris    schedule 02.02.2016


Ответы (2)


Поскольку строка является постоянной, ее нельзя изменить. Цикл на основе диапазона использует тип auto &, который фактически станет const char &. Это означает, что вы ссылаетесь на символы в реальной строке, а не на их копии.

person paddy    schedule 02.02.2016

Поскольку s - это константная строка, поэтому вы не можете изменить ее значение. В этом случае тип c будет const char&.

person songyuanyao    schedule 02.02.2016