Разница между константными ссылками C ++ и констант? - PullRequest
1 голос
/ 14 октября 2010

В чем разница между:

const double& pi = 3.14;

и (без амперсанда):

const double pi = 3.14;

Кажется, что они оба имеют одинаковые значения L и R, в чем разница?

Ответы [ 6 ]

7 голосов
/ 14 октября 2010

Для вашего конкретного примера нет разницы.

А это значит, что никак нельзя их отличить друг от друга.

Однако, так как первый привязывает ссылку к временному объекту, когда тип относится к типу класса, временный объект может быть производного класса, например, производится функцией! И тогда его деструктор должным образом вызывается в конце области видимости. Этот маленький электронный трюк используется в реализациях ScopeGuard.

Однажды я спросил Бьярна Страуструпа, который создал язык C ++, почему поддерживается синтаксис в вашем первом объявлении.

И он ответил, что в основном это были единые правила (то есть не делать каких-либо особых исключений для локальных ссылок, в отличие от ссылок как формальных параметров). Я думаю, что в то время никто из нас не был знаком с ScopeGuard. В ретроспективе все просто, но для того, чтобы придумать что-то подобное, нужен ум Петру или Андрея! : -)

Приветствия и hth.

1 голос
/ 14 октября 2010

Небольшое разъяснение о константах, ссылках и константах для double с.

Ссылки

Ссылка относится к существующему объекту и не может быть повторно . То есть, как только вы объявите (определите) ссылку, она всегда будет ссылаться на этот элемент.

Ссылка на константу

Язык C ++ позволяет объявлять постоянную ссылку. Это говорит компилятору, что ссылка не изменится. Это может быть избыточно, так как ссылки не могут быть повторно установлены. Однако синтаксис языка это позволяет.

Constant

Константа - это значение, которое не ни на что не ссылается .

Оптимизации и замены

Компилятору разрешено заменять (заменять) ссылку на объект, константу или литерал, на соответствующий объект, константу или литерал, при условии, что компилятор может гарантировать, что никакие операции записи не выполняются для этого объекта в пределах его видимости. используется в. Это определение может стать трудным, когда ссылка передается на методы или функции в этой области.

Указание модификатора const для ссылки облегчит работу компилятора. Постоянная ссылка - это контракт с программистом и пользователем, что ссылка не будет изменена.

1 голос
/ 14 октября 2010

Важным отличием от ссылки является то, что сама ссылка является наследственно постоянной.Как только сама ссылка была изначально присвоена переменной, она не может ссылаться на другую переменную.Все попытки изменить его изменят переменную, к которой он относится.Учитывая это, const будет означать, что ссылка является ссылкой на const int.

const int A;
const int B;
const int& Reference = A;
Reference = B; // Error, the value of A can not be assigned, nor would this *ever* be able to make Reference refer to B.

Вы также можете проверить эту теорию на предмет того, что сама ссылка является постоянной, например:*

0 голосов
/ 02 мая 2016

В C ++ ссылки по своей сути постоянны.После того, как они были назначены, вы не можете их изменить.Они должны быть объявлены и инициализированы.

0 голосов
/ 14 октября 2010

Ссылка не является константой, только значение является константой, поэтому вы должны иметь возможность переназначить ссылку, это означает, что следующее будет в порядке:

const double& pi = 3.14;
const double  pi2 = 2.78;
pi = *(&pi2);
0 голосов
/ 14 октября 2010

const double & - это ссылка на константу double, другая - на константу double. Ссылка является своего рода константным указателем, указателем, который никогда не изменяется.

...