Насколько я могу судить, нет никаких причин, по которым мне нельзя разрешать передавать ссылку на указатель в C ++. Однако мои попытки сделать это терпят неудачу, и я не знаю почему.
Вот что я делаю:
void myfunc(string*& val)
{
// Do stuff to the string pointer
}
// sometime later
{
// ...
string s;
myfunc(&s);
// ...
}
И я получаю эту ошибку:
невозможно преобразовать параметр 1 из 'std :: string *' в 'std :: string * &'
string* const& val
вместо менее разборчивого эквивалента, например, напримерconst string* &val
. На мой взгляд, это явно константная ссылка на указатель, на строку. Я лично предпочитаю писать,T const&
а неconst T&
декларировать, чтобы получить это точное разъяснение.bind a temporary to the reference
этот ответ яснее, чем @Chris 'asreference to an actual string pointer in the calling scope, not an anonymous string pointer
. Тем не менее, с моей точки зрения, оба варианта верны.const string*&
аstring* const&
на самом деле разные типы. Первый - это неconst
ссылка на aconst string*
, а второй -const
ссылка на astring*
.T const&
чтобыconst T&
- в качестве @Justin времени указывает, что различные типы. Он не может иметь никаких последствий иногда, но в других ситуациях это будет абсолютно необходимо , чтобы предпочесть один или другой, так же, как предпочитает ,int
чтобыdouble
.Измените его на:
РЕДАКТИРОВАТЬ:
Это вызывается,
ref-to-pointer
и вы не можете передать временный адрес в качестве ссылки на функцию. (если это не такconst reference
).Хотя я показал
std::string* pS = &s;
(указатель на локальную переменную), его типичное использование будет следующим: когда вы хотите, чтобы вызываемый объект изменял сам указатель, а не объект, на который он указывает. Например, функция, которая выделяет память и назначает адрес блока памяти, который она выделила своему аргументу, должна принимать ссылку на указатель или указатель на указатель:источник
&s
создает временный указатель на строку, и вы не можете ссылаться на временный объект.источник
Пытаться:
или
источник
РЕДАКТИРОВАТЬ: Я экспериментировал с некоторыми, и обнаружил, что это немного тоньше, чем я думал. Вот что я считаю точным ответом.
&s
не является lvalue, поэтому вы не можете создать ссылку на него, если тип ссылки не является ссылкойconst
. Так, например, вы не можете делатьно ты можешь сделать
Если вы поместите аналогичное объявление в заголовок функции, она заработает.
Есть еще одна проблема, а именно временные. Правило состоит в том, что вы можете получить ссылку на временное, только если оно есть
const
. Таким образом, в этом случае можно утверждать, что & s является временным и поэтому должен быть объявленconst
в прототипе функции. С практической точки зрения это не имеет значения. (Это либо r-значение, либо временное. В любом случае применяется то же правило.) Однако, строго говоря, я думаю, что это не временное, а r-значение. Интересно, есть ли способ провести различие между ними. (Возможно, это просто определено, что все временные значения являются rvalue, а все значения, отличные от lvalue, являются временными. Я не эксперт по стандарту.)При этом ваша проблема, вероятно, на более высоком уровне. Зачем нужна ссылка на адрес
s
? Если вам нужна ссылка на указательs
, вам нужно определить указатель, как вЕсли вам нужна ссылка
s
или указатель наs
, сделайте простую вещь.источник
Я только что использовал ссылку на указатель, чтобы сделать все указатели в удаленном двоичном дереве, кроме корневого, безопасными. Чтобы сделать указатель безопасным, нам просто нужно установить его в 0. Я не мог заставить функцию, которая удаляет дерево (сохраняя только корень), принимать ссылку на указатель, поскольку я использую корень (этот указатель) в качестве первого ввод для перемещения влево и вправо.
В конце концов, ссылка на указатель недействительна, если формальным параметром является указатель (this).
источник
Добро пожаловать в C ++ 11 и ссылки на rvalue:
Теперь у вас есть доступ к значению указателя (на который указывает
val
), который является адресом строки.Вы можете изменить указатель, и это никого не волнует. Это в первую очередь один из аспектов того, что такое rvalue.
Будьте осторожны: значение указателя действительно только до
myfunc()
возврата. Наконец, это временное явление.источник
Я знаю, что можно передавать ссылки на указатели, я сделал это на прошлой неделе, но я не могу вспомнить, какой был синтаксис, так как ваш код сейчас кажется мне правильным. Однако другой вариант - использовать указатели указателей:
источник
myfunc ("string * & val") это само по себе не имеет никакого смысла. "string * & val" подразумевает "string val", * и & отменяют друг друга. Наконец, в функцию нельзя передать строковую переменную ("string val"). В функцию можно передавать только базовые типы данных, другие типы данных необходимо передавать как указатель или ссылку. Для функции вы можете использовать строку & val или строку * val.
источник