РЕДАКТИРОВАТЬ: Я экспериментировал с некоторыми, и обнаружил, что это немного тоньше, чем я думал. Вот что я считаю точным ответом.
&s
не является lvalue, поэтому вы не можете создать ссылку на него, если тип ссылки не является ссылкой const
. Так, например, вы не можете делать
string * &r = &s;
но ты можешь сделать
string * const &r = &s;
Если вы поместите аналогичное объявление в заголовок функции, она заработает.
void myfunc(string * const &a) { ... }
Есть еще одна проблема, а именно временные. Правило состоит в том, что вы можете получить ссылку на временное, только если оно есть const
. Таким образом, в этом случае можно утверждать, что & s является временным и поэтому должен быть объявлен const
в прототипе функции. С практической точки зрения это не имеет значения. (Это либо r-значение, либо временное. В любом случае применяется то же правило.) Однако, строго говоря, я думаю, что это не временное, а r-значение. Интересно, есть ли способ провести различие между ними. (Возможно, это просто определено, что все временные значения являются rvalue, а все значения, отличные от lvalue, являются временными. Я не эксперт по стандарту.)
При этом ваша проблема, вероятно, на более высоком уровне. Зачем нужна ссылка на адрес s
? Если вам нужна ссылка на указатель s
, вам нужно определить указатель, как в
string *p = &s;
myfunc(p);
Если вам нужна ссылка s
или указатель на s
, сделайте простую вещь.
string* const& val
вместо менее разборчивого эквивалента, например, напримерconst string* &val
. На мой взгляд, это явно константная ссылка на указатель, на строку. Я лично предпочитаю писать,T const&
а неconst T&
декларировать, чтобы получить это точное разъяснение.