Вот немного другой метод. [ ухмыляясь ] мне удалось не заметить ответ Джеффа Цейтлина, пока я не закончил это.
[edit - спасибо Джеффу Зейтлину за напоминание, что ОП хочет получить конечный результат в виде строки. упс! [* blush *]]
что он делает ...
вот код ...
$OriginalIPv4 = '1.1.1.1'
$TargetOctet = 3
$OctetList = [int[]]$OriginalIPv4.Split('.')
$OctetList[$TargetOctet - 1]++
$NewIPv4 = [ipaddress]($OctetList -join '.')
$NewIPv4
'=' * 30
$NewIPv4.IPAddressToString
output ...
[ 111]Ваша функция ожидает ссылку на фактический указатель строки в вызывающей области, а не на анонимный указатель на строку. Таким образом:
string s;
string* _s = &s;
myfunc(_s);
должен компилироваться нормально.
Однако это полезно только в том случае, если вы намереваетесь изменить указатель, который вы передаете функции. Если вы намереваетесь изменить саму строку, вам следует использовать ссылку на строку, как предлагает Саке. Имея это в виду, должно быть более очевидно, почему компилятор жалуется на ваш исходный код. В вашем коде указатель создается «на лету», изменение этого указателя не будет иметь никаких последствий, и это не то, что предполагается. Идея ссылки (а не указателя) заключается в том, что ссылка всегда указывает на реальный объект.
myfunc ("string * & val"), это само по себе не ' не имеет никакого смысла. «string * & val» подразумевает «string val», * и & отменяет друг друга. Наконец, нельзя передать строковую переменную в функцию («string val»). Только основные типы данных могут быть переданы в функцию, для других типов данных необходимо передать в качестве указателя или ссылки. Вы можете использовать либо строку & val, либо строку * val для функции.
Я знаю что можно передавать ссылки на указатели, я сделал это на прошлой неделе, но я не могу вспомнить, какой был синтаксис, так как ваш код сейчас кажется мне правильным. Однако другой вариант - использовать указатели указателей:
Myfunc(String** s)
Замените его на:
std::string s;
std::string* pS = &s;
myfunc(pS);
РЕДАКТИРОВАТЬ:
Это называется ref-to -pointer
, и вы не можете передать временный адрес в качестве ссылки на функцию. (если это не ссылка на константу
).
Хотя я показал std :: string * pS = & s;
(указатель на локальную переменную), его типичное использование будет :
когда вы хотите, чтобы вызываемый объект изменял сам указатель, а не объект, на который он указывает. Например, функция, которая выделяет память и назначает адрес блока памяти, который она выделила своему аргументу, должна принимать ссылку на указатель или указатель на указатель:
void myfunc(string*& val)
{
//val is valid even after function call
val = new std::string("Test");
}
Попробуйте:
void myfunc(string& val)
{
// Do stuff to the string pointer
}
// sometime later
{
// ...
string s;
myfunc(s);
// ...
}
или
void myfunc(string* val)
{
// Do stuff to the string pointer
}
// sometime later
{
// ...
string s;
myfunc(&s);
// ...
}
Проблема в том, что вы пытаетесь привязать временную ссылку к ссылке, что C ++ не позволяет, если ссылка не const
.
Таким образом, вы можете выполните одно из следующих действий:
void myfunc(string*& val)
{
// Do stuff to the string pointer
}
void myfunc2(string* const& val)
{
// Do stuff to the string pointer
}
int main()
// sometime later
{
// ...
string s;
string* ps = &s;
myfunc( ps); // OK because ps is not a temporary
myfunc2( &s); // OK because the parameter is a const&
// ...
return 0;
}
& s
создает временный указатель на строку, и вы не можете ссылаться на временный объект.
РЕДАКТИРОВАТЬ: Я экспериментировал с некоторыми, и обнаруженные вещи оказались немного более тонкими, чем я думал. Вот то, что я считаю точным ответом:
& s
не является lvalue, поэтому вы не можете создать ссылку на него, если тип ссылки не ссылается на const
. Так, например, вы не можете сделать
string * &r = &s;
, но можете сделать
string * const &r = &s;
Если вы поместите аналогичное объявление в заголовок функции, оно будет работать.
void myfunc(string * const &a) { ... }
Есть еще одна проблема, а именно временные. Правило состоит в том, что вы можете получить ссылку на временный объект, только если он const
. Так что в этом случае можно утверждать, что & s является временным, поэтому его необходимо объявить const
в прототипе функции. С практической точки зрения это не имеет значения. (Это либо rvalue, либо временное значение. В любом случае применяется то же правило.) Однако, строго говоря, я думаю, что это не временное, а rvalue. Интересно, есть ли способ провести различие между ними. (Возможно, это просто определено, что все временные значения являются r-значениями, а все не-l-значения являются временными. Я не эксперт по стандарту.)
При этом ваша проблема, вероятно, на более высоком уровне. Зачем нужна ссылка на адрес s
? Если вам нужна ссылка на указатель на s
, вам необходимо определить указатель, как в
string *p = &s;
myfunc(p);
. Если вам нужна ссылка на s
или указатель на s
, сделайте простую вещь.