Когда я должен передать указатель типа "T * const &"? - PullRequest
4 голосов
/ 09 июля 2011

Я бы передал указатель T*&, когда я собираюсь изменить указанное значение внутри функции:

void foo(char *&p)
{
  p = (b == true)? new char[10] : 0;
}

Но я не могу получить то, что является вариантом использования для T* const& видауказателя (так как этот указатель не является изменяемым)?Я имею в виду, почему я не должен просто пройти T* const?

void foo(char* const &p);  // p is not changeable
void foo(char* const p);   // p is not changeable

Ответы [ 3 ]

10 голосов
/ 09 июля 2011

Вы бы использовали T* const & в качестве параметра, если значение объекта-указателя может быть изменено чем-то внешним по отношению к вашей функции, и вы хотите иметь возможность наблюдать изменения в значении объекта-указателя или если вы хотите сохранить ссылку или указатель на объект указателя для последующего чтения.

Параметр T* (эквивалентный T* const в качестве параметра функции) просто дает вам копию объекта указателя, снимок его значения, когда он был передан вашей функции.

void foo( char* const& ptr )
{
    char* p1 = ptr; // initial value
    global_fn();    // ptr might be changed
    char* p2 = ptr; // new value of ptr
}

против

void foo2( char* ptr )
{
    char* p1 = ptr; // initial value
    global_fn();    // ptr can't be changed, it's local to this function
    char* p2 = ptr; // will be the same as p1
}

Технически, даже сама функция может изменить значение указателя, на который передается ссылка.

* 1014 Е.Г. *

char* p;

std::ptrdiff_t foo( char* const& ptr )
{
    ++p;
    return p - ptr; // returns 0, would return 1 if the parameter was by value
}

int main()
{
    char test[] = "Hello, world!";
    p = test;
    foo( p );
}
3 голосов
/ 09 июля 2011

Разница реально равна нулю. Ссылки const используются, чтобы предотвратить копирование дорогостоящих копий или, в общем коде, не копируемых типов, но поскольку указатели тривиальны, они незначительны, и вы также можете взять их по значению.

0 голосов
/ 16 августа 2011

Я думаю, что более простой пример проиллюстрировал бы точку зрения Чарльза Бейли.Давайте уберем вопрос с указателем его части, потому что для этого вопроса это неактуально.Таким образом, ваш вопрос в основном звучит так:

void foo(const int &p);  // p is not changeable
void foo(const int p);   // p is not changeable

Вы видите более четко, как это работает?Да, локальная переменная "p" не может быть назначена в обоих случаях.И да, ни один фрагмент кода не повлияет на переменную в вызывающей области.Но в первом примере p может быть ссылкой на переменную (неконстантную) int, которую можно изменить, в то время как последний является аргументом, передаваемым по значению, которое не может быть изменено.(На самом деле const во втором примере не влияет ни на что, кроме функции, так что это отчасти лишнее. То же самое со вторым примером в вопросе.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...