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&
декларацій, щоб отримати це точне роз'яснення.