Вопрос

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

const double& pi = 3.14;

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

const double pi = 3.14;

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

Это было полезно?

Решение

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

А это значит, что никоим образом не обращаются за ними.

Однако, поскольку первый связывает ссылку на временный, когда тип типа класса, временный может быть полученный класс, например, создается функцией! И затем он правильно назван в конце сфера. Этот маленький трюк El Neato используется в реализациях ScopeGuard (см. Оригинал Статья ScopeGuard в DDJ, Петру Маргинан и Андрей Александреску - Петру изобрел ScopeGuard, а Андрей сделал более общую вещь на вершине).

Однажды я спросил Bjarne Stroustrup, который создал язык C ++, почему поддерживается синтаксис в вашем первом декларации.

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

Ура и hth.

Другие советы

Важное различие со ссылкой заключается в том, что сама ссылка наследительно постоянна. После того, как сама ссылка была первоначально назначена переменной, она не может ссылаться на другую переменную. Все попытки изменить его изменят переменную, на которую она ссылается. Учитывая это, 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.

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

const int& const Reference; // Should give a warning about the second const being redundant.

Немного разъяснения о постоянных ссылках, ссылках и константах для doubleс

Справка

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

Постоянная ссылка

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

Постоянный

Постоянная - это значение, а не ссылаться к чему -либо.

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

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

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

Const Double и является ссылкой на постоянный двойник, другой - постоянный двойник. Ссылка - это своего рода указатель Const, указатель, который никогда не меняется.

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

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

const double& pi = 3.14;
const double  pi2 = 2.78;
pi = *(&pi2);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top