2010-05-31 3 views
2

У меня проблемы с обволакиванием головы. У меня есть функцияНачинающий вопрос о получении ссылки на cin

void foo(istream& input) { 
    input = cin; 
} 

Это выходит из строя (я предполагаю, потому что CIN не должен быть «копируемыми».

однако, это работает

void foo(istream& input) { 
    istream& baz = cin; 
} 

Есть ли причина, по которой Я могу получить ссылку на CIN в Baz, но я не могу назначить его на вход?

Благодаря

+1

Это потому, что input = cin; похоже на выполнение (если вход был istream *) * input = cin; –

ответ

2

Синтаксис:

void foo(istream& input) { 
    input = cin; 
} 

не создает ссылку. он вызывает operator=, который предназначен для копирования вещей вокруг.
Этот синтаксис однако:

void foo(istream& input) { 
    istream& baz = cin; 
} 

определяет новую ссылочную переменную.

Ключевым моментом является то, что в C++ вы не можете изменить ссылку, как только вы ее объявили.
После объявления ссылка ведет себя так, как будто это объект, на который ссылается сам. Таким образом, используя operator=, он пытается скопировать в него.

1

Это совершенно разумно.

Клонирование и создание псевдонима для него - это разные операции.

0

& (reference) действительно работает как псевдоним имени, поэтому все ваши изменения действительно выполняются над объектом, на который вы ссылаетесь.

Следовательно, первый фрагмент кода выходит из строя, потому что вы работаете непосредственно с вашим псевдонимом, который имеет недоступный (закрытый) operator=.

Ваш второй фрагмент кода на самом деле означает, что вы создаете псевдоним другого имени, поэтому он действителен.

0

A должен быть инициализирован, но не может назначаться. К сожалению, инициализация и назначение (могут) используют =, поэтому не всегда очевидно, что именно. В этом случае эта разница имеет решающее значение.

Когда вы делаете istream& baz = cin;, вы инициализируете ссылку, но ничего не делаете для самого istream. Когда вы делаете input = cin;, это не Инициализация, потому что в этот момент input уже был инициализирован. Это оставляет только одну возможность: назначение. Однако, поскольку вы не можете назначить эту ссылку, ее интерпретируют как попытку назначить cin потоку, на который ссылается input. Поскольку потоки не могут быть назначены, компилятор отвергает это.

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