Это официальное обозначение: Foo & foo = Bar; - PullRequest
0 голосов
/ 31 октября 2011
struct Foo {};
struct Bar : Foo {};

Foo &foo = Bar; // without ()

Интересно, это законная запись? И если это законно, не могли бы вы рассказать подробнее? Что-то вроде, почему это законно? Или, каково происхождение такой записи?

РЕДАКТИРОВАТЬ: Я не могу скомпилировать этот код. Но я встретил такой код и хотел узнать, разрешена ли такая нотация (возможно, просто мой компилятор не поддерживает эту нотацию). У меня есть некоторая неопределенность, так как следующие обозначения вполне допустимы: Foo *pFoo = new Bar;

Ответы [ 4 ]

3 голосов
/ 31 октября 2011

Это должна быть ошибка компилятора.

g ++: ошибка: ожидаемое первичное выражение перед ';' лексема

Bar - это имя class, и оно не может быть назначено для ссылки / переменной. Даже с положением () он не скомпилируется, если вы не сделаете foo a const Foo&.

2 голосов
/ 31 октября 2011
  1. Вы не можете назначить Имя класса для ссылки / объекта. Это не синтаксически верно и не имеет никакого смысла.
  2. Вы не можете привязать ссылку к временному (rvalue), поэтому следующее также недопустимо:

    Foo &foo = Bar();

  3. Вы можете привязать временное значение (rvalue) к константной ссылке, поэтому допустимо следующее:

    const Foo &foo = Bar();

Стандарт C ++ специально разрешает 3.

1 голос
/ 31 октября 2011

Представленный код недопустим, поскольку Bar - это имя класса, а не переменной.

Однако следующее:

struct Foo {}
struct Bar : Foo {}

Bar fooBar;
Foo &foo = fooBar; // without ()

Это законно, потому что Bar - это Foo, поэтому вы просто даете другое имя своей переменной fooBar.

Обратите внимание, что foo, хотя псевдоним для fooBar, будет интерпретировать местоположение как Foo объект.

Это означает следующее:

struct Foo { int x; };       //note semicolons after struct declaration
struct Bar : Foo { int y; };

Bar fooBar;
fooBar.y = 2;
fooBar.x = 3;
Foo &foo = fooBar;
int aux;
aux = foo.x; // aux == 3
aux = foo.y; // compile error
0 голосов
/ 31 октября 2011

Вы не можете присвоить значение для ссылки. Так как уже упоминалось, это не является законным независимо от скобок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...