Правильная грамматика для справки - PullRequest
0 голосов
/ 10 мая 2018

Я вижу такой код:

Foo const& foo = val; // (A)
const Foo& foo = val; // (B)

Просто другое размещение const.

Хотя оба будут работать нормально, я просто хотел бы знать правильную грамматику.

Я прочитал это следующим образом из R-> L.

(A) foo является ссылкой const на тип Foo - не уверен, является ли val const
(B) foo является ссылкой на const type Foo - что означает val is const

Учитывая, что ссылки не являются объектами, и технически все ссылки const (они не могут ссылаться на другой объект),

Грамматическая перспектива , считается ли (A) Foo const& foo = val; "запутанным" определением?

И просто используйте вместо этого:

const Foo& foo = val; // referring to const Foo
Foo& foo = val;       // referring to non-const Foo

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Они идентичны грамматически. И

Я прочитал это следующим образом из R-> L.

(A) foo является ссылкой const на тип Foo

Я думаю, вы не правильно прочитали. Это должно быть что-то вроде

Foo const &
Foo/const/reference to

тогда вы должны получить "ссылку на const Foo`. Поэтому при чтении из R-> L (A) более ясно.

0 голосов
/ 10 мая 2018

const относится к вещи слева от нее, если там ничего нет, то вместо этого она применяется к вещи справа от нее.

Эти два утверждения идентичны :

Foo const& foo = val; // (A)
const Foo& foo = val; // (B)

Они оба означают одно и то же:

foo не является const (1) ссылкой на объект const Foo и инициализируется как ссылка на объект с именем val.

(1) : по определению, ссылка не может быть изменена после инициализации, поэтому const против non- const на самом деле не относится к самой ссылке, поскольку это неявно const. Но const относится к тому объекту, на который ссылаются.

0 голосов
/ 10 мая 2018
Foo const& foo = val; // (A)
const Foo& foo = val; // (B)

Оба являются идентичными определениями и являются просто вопросом стиля: ссылка на константный объект.

это будет отличаться для:

const Foo* fooC = nullptr; // (C)
Foo* const fooD = nullptr; // (D)

Вы не можете переназначить fooDно вы можете переназначить fooC.Объект, указанный fooC, не может быть изменен через fooC.Объект, обозначенный fooD, может быть изменен через fooD.

...