РЕДАКТИРОВАТЬ: Я экспериментировал с некоторыми, и обнаружил, что это немного тоньше, чем я думал. Вот что я считаю точным ответом.
&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&декларировать, чтобы получить это точное разъяснение.