EDIT: Я експериментував з деякими, і виявив, що дещо тонше, ніж я думав. Ось що я вважаю, що це точна відповідь.
&sне є значенням, тому ви не можете створити посилання на нього, якщо тип посилання не має посилання const. Так, наприклад, ви не можете цього зробити
string * &r = &s;
але ти можеш зробити
string * const &r = &s;
Якщо ви помістите аналогічне оголошення у заголовок функції, воно буде працювати.
void myfunc(string * const &a) { ... }
Є ще одне питання, а саме - тимчасовості. Правило полягає в тому, що ви можете отримати посилання на тимчасове, тільки якщо воно є const. Тож у цьому випадку можна стверджувати, що & s є тимчасовим, і тому його потрібно задекларуватиconst в прототипі функції. З практичної точки зору це не має жодного значення в цьому випадку. (Це або ревальвація, або тимчасова. Так чи інакше, застосовується те саме правило.) Однак, строго кажучи, я думаю, що це не тимчасовий, а ревальваційний. Цікаво, чи є спосіб розрізнити між собою. (Можливо, просто визначено, що всі тимчасові знаки є ревальваціями, а всі неістотні значення - тимчасовостями. Я не є експертом зі стандарту.)
Це, мабуть, ваша проблема, мабуть, на більш високому рівні. Чому ви хочете посилатися на адресу s? Якщо ви хочете посилання на вказівник s, вам потрібно визначити вказівник як в
string *p = &s;
myfunc(p);
Якщо ви хочете посилання на sабо вказівник s, виконайте прямо.
string* const& valзамість менш розбірливого еквівалента, наприклад, наприкладconst string* &val. Для моїх очей це очевидно посилання на const , на вказівник, на рядок. Я особисто вважаю за краще писатиT const&замістьconst T&декларацій, щоб отримати це точне роз'яснення.