Подтвердить что ты не робот

Указатель ссылки

Я читал, и я увидел следующий код:

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?

4b9b3361

Ответ 1

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

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

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), и нет смысла передавать указатели по ссылке (передать по ссылке не более эффективно, чем передавать по значению для небольших объектов, таких как указатели и целые числа). Я бы не хотел догадываться, почему это было сделано в вашем случае.

Ответ 2

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

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

объявить я в качестве ссылки на указатель const на const char

Теперь смысл декларации должен быть очевиден.

Ответ 3

Отбросьте это отдельно:

  • конечный & означает, что это ссылка на любой тип.

  • const char - это тип, указывающий на

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

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

Ответ 4

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

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

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

Ответ 5

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

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