2016-06-09 3 views
25

я читал, и я увидел следующий код:Указатель на ссылку

template <> 
inline bool is_empty(const char* const& x) 
{ 
    return x==0 || *x==0; 
} 

Что const char* const& x значит?

Я попытался следующий код, чтобы понять:

void f(const char* const& x) 
{ 
    // whatever 
} 

void main() 
{ 
    char a = 'z'; 
    char &j = a; 
    f(a);//error 
    f(*a);//error 
    f(&a);//fine 
    f(j);//error 
    f(&j);//fine  
    f('z');//error 
} 

Он работает только для f(&a) и f(&j).

Что делает const char* const& x на самом деле означает?

+2

Это как 'f (const T &)', где 'T = const char *'. –

+0

'const' определяет тип, который изменяет объект, становится плохо сформированным. Сообщения об ошибках, которые вы получаете в каждом случае, должны объяснять, что происходит. – user2079303

+4

Обратите внимание, что это не указатель на ссылку, поскольку заголовок говорит (нет такой вещи), но ссылка на указатель. –

ответ

6

Ссылка на указатель - это именно то, что он говорит, ссылка на указатель.

Рассмотрите то, что мы знаем о ссылках. Ссылка на C++ является переменной, которая относится к существующей переменной в другом месте:

int x = 1; 
int &y = x; // <-- y refers to x. Any changes to y will update x as well, and vice versa. 

Также рассмотрите то, что мы знаем о указателях. Указатель указывает на другой объект в памяти:

int *m = new int(5); // Pointer to an allocated integer in memory. 
int *n = m;   // Pointer to the same memory. 

Так что в вашем случае то, что вы на самом деле имеете, является ссылкой на указатель!

int *m = new int(5); // Pointer to an allocated integer in memory. 
int *ptr = m;   // Pointer to m. 
int *&ptrRef = ptr; // Reference to ptr. 

В приведенном выше примере, изменение ptrRef обновит указатель, но не значение.

Вот немного более полного примера:

int *myPtr = new int(5); // myPtr points to an integer. 

... 

void ChangePointer(int *&ptr) 
{ 
    delete ptr; 
    ptr = new int(6); 
} 

... 

std::cout << *myPtr << std::endl; // <-- Output "5" 
ChangePointer(myPtr); 
std::cout << *myPtr << std::endl; // <-- Output "6" 

В приведенном выше примере мы передаем myPtr к ChangePointer посредством ссылки, так что он может быть изменен с помощью функции. Если мы не пройдем по ссылке, любые изменения, сделанные внутри функции, будут потеряны.

В вашем случае вы передаете ссылку на указатель const. Это примерно эквивалентно:

DoStuff(const Object &myObject); 

В вашем случае, вы передаете указатель, а не объект, хотя.

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

+0

Не могли бы вы исправить строку 2 в первом разделе кода? Вместо «x» вы используете «a». Это немного запутанно. – Tonny

+0

@Tonny - Подумайте об этом. Упс! –

29

cdecl - полезный онлайн-инструмент, помогающий новичкам привыкнуть к сложным объявлениям.

const char* const& i Установка возвращается:

заявляет, что я, как ссылка на константный указатель на константный полукокс

Значения декларации должно быть очевидно, в настоящее время.

+1

Я думаю, что его «постоянная ссылка на постоянный указатель типа char» – sagar

+7

@sagar: Нет, нет такой вещи, как постоянная ссылка. По своей природе ссылки сами по себе (не могут быть пересмотрены), поэтому добавление «константы» до того, как это будет pleonasm. –

+0

@MarcvanLeeuwen да, вы пишете. Я неверно истолковал декларацию. Благодарим вас за разъяснения. – sagar

0

Он должен перевести на «Ссылка на постоянный указатель на постоянный символ». Это означает, что указанному указателю не может быть назначен новый целевой адрес (указать), а ссылка, которую он ссылается, не может быть изменена.

отредактирован после комментария. Однако последствия должны оставаться неизменными.

+0

Это не константа ref, это ссылка на указатель const. –

+0

Правильно, извините. Познакомился с константной ассоциацией справа налево в конце. – starturtle

+0

@ Постоянная ссылка MarcusMüller - это то же самое, что ссылка на константу. Даже стандарт говорит о «константной ссылке», хотя ссылка на const может быть лучшим описанием. – user2079303

9

Давайте это друг от друга:

  • задний & означает, что это ссылка к тому, что тип является.

  • const char тип, который указывает на время

  • * const означает, что указатель является постоянным

Итак, это ссылка на константный указатель на константный символ. Вы не можете изменить char, на который он указывает (если вы не отбросили constness), и вы не можете изменить указатель (т. Е. Указать ему на что-то еще). Указатель передается по ссылке, поэтому копирование не происходит.

+0

Что это значит? – 0xFF

+0

Простой и понятный. И использование шаблона 'const &' делает 'f (« hello »),' также приемлемым. – Loreto

1

Другие ответы в основном охватывают семантику ссылок на указатели.

Но что, если вы в сомнении: является ли ссылка на указатель или указатель на ссылку? Это может сбить с толку! Однако, C++ не позволяет указатель на ссылки!

Указатели хранят адреса объектов и ссылки являются не объекты, так что не может быть какой-либо указатель ссылки.

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